ASP Web API Kendo UI Grid值不能为null:entity

时间:2017-03-24 13:07:03

标签: asp.net asp.net-web-api kendo-ui kendo-grid

我在Web API应用程序中使用了Kendo UI中的Grid组件。我的记录正确加载,甚至删除工作正常,但不幸的是发布更新无效。我收到了关于请求响应的错误消息:消息:“发生错误。”,exceptionMessage:“值不能为空.↵Parametername:entity”,...}

我视线和控制器的贝娄部分。我错过了什么?尝试很多东西。 *字段名称是小写的,因为我使用的是CamelCase。

$(document).ready(function () {
    var dataSource = new kendo.data.DataSource({
        transport: {
            read: {
                url: "/api/products",
                dataType: "json"
            },
            update: {
                url: function (data) {
                    return "/api/products/" + data.id;
                },
                dataType: "json",
                type: "PUT"
            },
            destroy: {
                url: function (data) {
                    return "/api/products/" + data.id;
                },
                dataType: "json",
                type: "DELETE"
            },
            create: {
                url: "/api/products",
                dataType: "json",
                type: "POST"
            },
            parameterMap: function (options, operation) {
                if (operation !== "read" && options.models) {
                    return { models: kendo.stringify(options.models) };
                }
            }
        },
        batch: false,
        pageSize: 20,
        schema: {
            model: {
                id: "id",
                fields: {
                    id: { editable: false, nullable: true },
                    name: { validation: { required: true } },
                    description: { validation: { required: true } }
                }
            }
        }
    });

    $("#grid").kendoGrid({
        dataSource: dataSource,
        pageable: true,
        height: 550,
        toolbar: ["create"],
        columns: [
            { field: "name", title: "Name" },
            { field: "description", title: "Description" },
            { command: ["edit", "destroy"], title: " ", width: "250px" 
        }],
        editable: "popup"
    });

这是我的控制器和存储库的一部分:

public IHttpActionResult GetProducts()
{
    var products = _productRepository.GetProducts();
    return Ok(products);
}

[HttpPost]
public IHttpActionResult CreateProduct(Product product)
{
    _productRepository.CreateProduct(product);
    _productRepository.SaveProduct();

    return Ok();
}

[HttpPut]
public IHttpActionResult UpdateProduct(int id, Product product)
{
    var productInDb = _productRepository.GetProduct(id);

    if (productInDb == null)
        return NotFound();

    _productRepository.UpdateProduct(product);
    _productRepository.SaveProduct();

    return Ok();
}


public Product GetProduct(int id)
{
    return _context.Products.SingleOrDefault(p => p.Id == id);
}

public void CreateProduct(Product product)
{
    _context.Products.Add(product);
}

public void UpdateProduct(Product product)
{
    _context.Entry(product).State = EntityState.Modified;
}

public void SaveProduct()
{
    _context.SaveChanges();
}

更新 我认为参数映射函数首先是错误的,因为当发布或更新它时,它永远不会进入条件,所以这里它更新了参数映射。在更改之后POST工作(它不仅关闭窗口并重新填充网格,我不知道为什么)。 但遗憾的是更新仍无法正常工作,因为我在控制器中收到以下错误“附加类型'Models.Product'的实体失败,因为同一类型的另一个实体已经具有相同的主要关键价值。“。在这种情况下我错过了什么?

parameterMap: function (options) {
    return kendo.stringify(options);
},
type: "json"

1 个答案:

答案 0 :(得分:0)

我设法通过注释中的帮助来解决它(基本上主要的问题是参数Map,然后需要填充tweek以及在返回控制器方法时传回实体)。我将下面的更新代码(仅限更改的部分)。

查看:

$(document).ready(function () {
    var dataSource = new kendo.data.DataSource({
        transport: {
            read: {
                url: "/api/products",
                dataType: "json"
            },
            update: {
                url: function (data) {
                    return "/api/products/" + data.id;
                },
                dataType: "json",
                type: "PUT"
            },
            destroy: {
                url: function (data) {
                    return "/api/products/" + data.id;
                },
                dataType: "json",
                type: "DELETE"
            },
            create: {
                url: "/api/products",
                dataType: "json",
                type: "POST"
            },
            parameterMap: function (options) {
                return kendo.stringify(options);
            },
            type: "json"
        },
        batch: false,
        pageSize: 20,
        schema: {
            model: {
                id: "id",
                fields: {
                    id: { editable: false, nullable: true },
                    name: { validation: { required: true } },
                    description: { validation: { required: true } }
                }
            }
        }
    });

    $("#grid").kendoGrid({
        dataSource: dataSource,
        pageable: true,
        height: 550,
        toolbar: ["create"],
        columns: [
            { field: "name", title: "Name" },
            { field: "description", title: "Description" },
            { command: ["edit", "destroy"], title: " ", width: "250px" 
        }],
        editable: "popup"
    });

控制器:

public IHttpActionResult GetProducts()
{
    var products = _productRepository.GetProducts();
    return Ok(products);
}

[HttpPost]
public IHttpActionResult CreateProduct(Product product)
{
    _productRepository.CreateProduct(product);
    _productRepository.SaveProduct();

    return Ok(product);
}

[HttpPut]
public IHttpActionResult UpdateProduct(int id, Product product)
{
    _productRepository.UpdateProduct(product);
    _productRepository.SaveProduct();

    return Ok(product);
}