ASP Web API - Kendo网格和模型状态

时间:2017-03-27 15:47:30

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

我在我的Web API post方法上使用了Kendo Grid和ModelState.IsValid条件。当我在网格上创建一个新记录时(事实上我正在使用网格的弹出选项创建一个新记录),它将我的类的Id发送为null,然后当它涉及我的控制器时,ModelState总是无效,因为它希望我的类的Id为0.我通过在操作为'create'时更改数据源的parameterMap上Id的值来解决它(参见下面的代码),但我真的不知道是否这是最好的解决方案,因为在我看来这是一种糟糕的方式。还有另一种方法可以解决这个问题吗?感谢。

查看:

$(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) {
                // THIS IS MY FIX FOR NOW
                if (operation === "create") {
                    options.id = 0;
                }
                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"
    });
});

控制器(我只使用post方法,因为它是得到问题的那个):

[HttpPost]
public IHttpActionResult CreateProduct(Product product)
{
    if (!ModelState.IsValid)
        return BadRequest();

    _productRepository.CreateProduct(product);
    _productRepository.SaveProduct();

    return Ok(product);
}

型号:

public class Product
{
    public int Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [Required]
    [StringLength(255)]
    public string Description { get; set; }
}

存储库:

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

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

1 个答案:

答案 0 :(得分:1)

id 字段可能是nullable: true

您可以将其删除并添加type: "number"吗?

fields: {
   id: { editable: false, type: "number" },
   name: { validation: { required: true } },
   description: { validation: { required: true } }
}