9

私はこのようなモデルを持っています:

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の値は正しいです。

まだ解決されていませんが、うまくいけば、この追加情報が解決策を見つけるのに役立ちます

4

3 に答える 3

1

エラーがOrderNumberフィールドから発生していることを確認しますか?

エラーメッセージに注文番号が2語で表示されているのは奇妙に思えます。

フィールドの名前を変更するか、必要なタグを削除して、これがエラーの原因であることを確認してください。

于 2010-05-11T08:27:04.750 に答える
1

jQueryの投稿がコントローラーに正しい方法で投稿されていない可能性があります。モデルを正確に表すオブジェクトではなく、注文番号だけを投稿している可能性があります。私はあなたのJavaScriptを絶対に確実にするために見なければならないでしょう。

そのメソッドに投稿する正しい方法は次のとおりです(注文番号が「orderNumber」と呼ばれるjavascript変数に格納されていると仮定します。

$.post([url to method], 
       { order: { OrderNumber: orderNumber } }, 
       function(json) {
       //Insert code for actions to take after AJAX post returns.
       },
       'json');

この場合、次のステップは、JavaScriptが実際に注文番号の値をキャプチャし、リクエストの一部として投稿していることを再確認することです。Firebugを簡単に調べると、それが起こっているかどうかがわかります。

于 2010-05-14T17:37:31.717 に答える
1

私はそれを「解決」しましたが、私が行った変更がなぜ役に立ったのか本当にわかりません。

私は3つのことをしなければなりませんでした:

  1. jsonフィルターを削除します(フィルターはバインドされません)

  2. contentTypeをapplication/jsonに変更します

    $ .ajaxSetup({contentType: "application / json; charset = utf-8"});

  3. ここで説明されているように、MVC先物ダウンロードMicrosoft.Mvc.dllを使用します:http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument。 aspx。Global.asax.csのApplication_Start()にこれを追加するとはどこにありますか?

    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

なぜそれがうまくいったのか正確にはわかりませんが、うまくいきました。

残念ながら、これにはマイナスの副作用がありました。contenttypeはすべての$ .get()メソッドと$ .post()メソッドに適用され、すべてのjqgridが壊れています。これらは、コンテンツタイプがapplication/xのデフォルトである場合にのみ機能するようです。 -www-form-urlencoded

だから私は2つのフォローアップの質問をしました:

  1. $ .post()呼び出しでコンテンツタイプを設定することは可能ですか?次に、グローバルに設定する必要はありません Jquery-$ .post()にcontentType = application / jsonを使用させる方法は?

  2. contenttypeがapplication/jsonの場合、jqridを機能させることはできますか? Jquery-$。post()にcontentType = application / jsonを使用させる方法は?

于 2010-05-16T21:22:20.237 に答える