0

Web APIのポストメソッドで剣道グリッドとModelState.IsValid条件を使用しています。グリッド上に新しいレコードを作成すると(実際には、新しいレコードを作成するためにグリッドのポップアップオプションを使用しています)、それは私のクラスのIDをnullとして送信しています。そして、コントローラになるとModelStateは常に私のクラスのIDが0になると期待しているので無効です。私は、操作が '作成'(以下のコードを参照)であるときに、データソースのparameterMap上のIDの値を変更することによって解決しましたが、それは私にとって貧弱な方法のように思えるので、最高の解決策です。この問題を解決する別の選択肢はありますか?ありがとう。ASP Web API - 剣道グリッドとモデル状態

ビュー:

$(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(); 
    } 
+0

View(*コードの残りの部分)*と製品モデルを表示できますか? – Win

+0

質問をフルコードで更新しました。ありがとう。 – jtron

答えて

1

idフィールドがnullable: trueである可能性があります。

削除してtype: "number"を追加できますか?

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

偉大な、それは働いて、多くのおかげで助けてください。 :) – jtron

関連する問題