2

問題があり、何が問題なのかわかりません。
私は Json オブジェクトを構築しています$.ajax。問題は、アクションで常に null になることです。
ここにAjaxの部分があります:

            $("input[type=button]#ajax-editor-save").click(function() {

            var hotelPropertyAssignModel = new Object();
            hotelPropertyAssignModel.Hotel_Id = 1;
            hotelPropertyAssignModel.HotelProperties = new Array();

            $("input.ajax-editor[data-edited=true]").each(function() {
                var hotelPropertyValue = new Object();
                hotelPropertyValue.HotelProperty_Id = $(this).attr("data-hotelPropertyId");
                hotelPropertyValue.Language = $(this).attr("data-lang");
                hotelPropertyValue.Value = $(this).attr("value");
                hotelPropertyAssignModel.HotelProperties.push(hotelPropertyValue);
            });

            $.ajax({
                url: '@Url.Action( "SetProperties" )',
                type: 'POST',
                dataType: 'json',
                data: JSON.stringify(hotelPropertyAssignModel)
            });
        });

ここにアクションがあります:

[AcceptVerbs( HttpVerbs.Post )]
[HttpPost]
public void SetProperties ( string hotelPropertyAssignModel )
{

}

パラメータを文字列に変更して、jsonがどのように来るかを検証しました。私も正しいモデルに置き換えるとnullになります!誰でも助けることができますか?

4

1 に答える 1

4

適切な contentType を設定していることを確認してください。

$.ajax({
    url: '@Url.Action( "SetProperties" )',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(hotelPropertyAssignModel)
});

使用していたdataTypeパラメータは、リクエスト タイプではなく、レスポンス タイプを示しています。たとえば、JsonResult を返す場合に、コントローラー アクションが Content-Type 応答ヘッダーを適切に設定する場合は必要ありません。

しかし、私が見ることができることから、コントローラーのアクションは明らかに間違っている void として宣言されています。コントローラーのアクションは、アクションの結果を返さなければなりません。内容を気にしない場合は、単に次を使用しますEmptyResult

[AcceptVerbs( HttpVerbs.Post )]
[HttpPost]
public ActionResult SetProperties ( string hotelPropertyAssignModel )
{
    ...
    return new EmptyResult();
}

また、コントローラーのアクションには別の非常に深刻な問題があります。ビューモデルの代わりに文字列引数を取ります!!! JSONリクエストを何らかの文字列にバインドすることをどのように期待していたのかわかりません。

したがって、送信する JSON 構造に一致するビュー モデルをすぐに定義します。

public class HotelAssignmentViewModel
{
    public int Hotel_Id { get; set; } 
    public HotelPropertyViewModel[] HotelProperties { get; set; }
}

public class HotelPropertyViewModel
{
    public int HotelProperty_Id { get; set; }
    public string Language { get; set; }
    public string Value  { get; set; }
}

次に、コントローラー アクションにこのビュー モデルをパラメーターとして使用させます。

[AcceptVerbs( HttpVerbs.Post )]
[HttpPost]
public ActionResult SetProperties ( HotelAssignmentViewModel model )
{
    ...
    return new EmptyResult();
}

あなたのコードには別の問題もあります。AJAX リクエストをトリガーするために一部の DOM 要素のクリック イベントをサブスクライブしたようですが、このイベントから false を返してデフォルト アクションをキャンセルすることはありません。たとえば、これが送信ボタンまたはアンカーである場合、ブラウザをページからリダイレクトするだけで、AJAX リクエストを実行する時間がありません。そのため、クリック ハンドラから false を返して、このデフォルト アクションを必ずキャンセルしてください。

$("input[type=button]#ajax-editor-save").click(function() {
    ...
    return false;
});
于 2013-01-31T15:55:53.423 に答える