私はこのようなモデルを持っています:
public PurchaseOrder
{
[Required] [StringLength(15)]
public virtual string OrderNumber {get;set;}
// etc.
}
ビューから注文を送信すると(input type =submitではなく$.postを使用)、コントローラークラスに送信されます。
public class PurchaseOrderController
{
public JsonResult Save(PurchaseOrder order)
{
// TryUpdateModel(order); // commented out since modelstate.isvalid remains false anyway
if (ModelState.IsValid)
{
// its never valid
}
}
}
ModelState.IsValidは常にfalseを返し、「注文番号フィールドは必須です」というエラーが表示されます。しかし、このフィールドには値があります(??理由)
値があるのに「値が必要」と言うのはなぜですか?私は何かを逃したことがありますか?送信ではなく$.postが原因ですか?私に何ができる?
デバッガーは次のようになります。
代替テキストhttp://www.freeimagehosting.net/uploads/f734f3d95d.png
編集:追加情報...
どういうわけか、モデルのバインドが行われていないと思います。ここにあるこのコードを試してみると:)
if (!ModelState.IsValid)
{
ModelState.Clear();
ModelMetadata modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => order, order.GetType());
ModelValidator compositeValidator = ModelValidator.GetModelValidator(modelMetadata, base.ControllerContext);
foreach (ModelValidationResult result in compositeValidator.Validate(null))
{
this.ModelState.AddModelError(result.MemberName, result.Message);
}
}
次に、ModelState.IsValid=trueです。CompositeValidator.Validate()は0エラーを返します。これはモデルがバインドされていないことを示していると思いますが、それでも理由はわかりません。
コントローラのメソッドは実際には次のようになります(この質問を最初に書いたときにフィルタを見逃しました)
[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))]
public JsonResult Save(PurchaseOrder order) { // etc ... }
そして、JsonFilterはこれを実行して、jsonが送信したデータからPOCOを抽出します。
filterContext.ActionParameters[Param]
= jsSerializer.Deserialize(inputContent, JsonDataType);
この行にブレークポイントを設定すると、orderは有効であり、さらにorder.OrderNumberの値は正しいです。
まだ解決されていませんが、うまくいけば、この追加情報が解決策を見つけるのに役立ちます