1

Ajax post を使用して Viewmodel をコントローラーに送り返そうとするコードが少しあります。ある方法でコードを記述した場合、コードは正しく通過し、別の方法ではビューモデル内で null または 0 の値を返します。

仕組み:

$(document).ready(function () {
        $(".boxItem").change(function (event) {
            var url = "/Search/GetBoxChangeInfo";
            $.post(url, @Html.Raw(Json.Encode(Model)), function (data) {
                $("#column-1").html(data);
            });
        });
    });

そして、null 値を返す方法:

$(document).ready(function () {
        $(".boxItem").change(function (event) {
            var url = "/Search/GetBoxChangeInfo";
            $.post(url, { json: @Html.Raw(Json.Encode(Model)) }, function (data) {
                $("#column-1").html(data);
            });
        });
    });

選択した値と ID に関するパラメーターを返す必要があるため、2 番目の方法で使用する必要があるため、次のようになります。

$(document).ready(function () {
        $(".boxItem").change(function (event) {
            var str = $(this).attr('id');
            var num = $(this).val();
            var url = "/Search/GetBoxChangeInfo";
            $.post(url, { json: @Html.Raw(Json.Encode(Model)), id : str, selected : num  }, function (data) {
                $("#column-1").html(data);
            });
        });
});

私のコントローラーはこのように見えます:

[HttpPost]
public ActionResult GetBoxChangeInfo(EventViewModel json)
{ 
     //stuff
}

編集 - 要求に応じて、ここに EventViewModel 構造があります

[JsonObject(MemberSerialization.OptIn)]
public class EventViewModel
{
    public int EventNumber { get; set; }
    public List<EventItemsViewModel> EventItems { get; set; }
    public List<LocationViewModel> Locations { get; set; }
    public int StartLocationID { get; set; }
    public bool Outbound { get; set; }
    public List<int> SelectedEvents { get; set; }
    public List<DurationsViewModel> Durations { get; set; }
}

なぜこれが起こっているのか誰にも分かりますか?この方法でコントローラーに送信できるホームに制限はありますか?これは非常に複雑なビューモデルであるため、それと関係があるのではないかと考えました。

ありがとう

4

4 に答える 4

2

このような:

$(document).ready(function () {
    $('.boxItem').change(function (event) {
        var str = $(this).attr('id');
        var num = $(this).val();
        var url = '@Url.Action("GetBoxChangeInfo", "Search")';
        $.ajax({
            url: url,
            contentType: 'application/json',
            data: JSON.stringify({ 
                json: @Html.Raw(Json.Encode(Model)), 
                id: str, 
                selected: num  
            }),
            success: function(data) {
                $("#column-1").html(data);
            }
        });
    });
});

注意事項:

  • contentType: 'application/json'
  • JSON.stringifyオブジェクトを JSON 文字列に変換する
  • var url = '@Url.Action("GetBoxChangeInfo", "Search")';URLのハードコーディングを避けるために
于 2012-05-24T11:45:19.387 に答える
1

この方法でコントローラーに送信できるホームに制限はありますか?これは非常に複雑なビューモデルであるため、それと関係があるのではないかと考えました。

はい、1000 個の HTTP コレクション キーがあり、web.config で自分で構成できます。最初に値を 4000 に設定してみてください。その後、必要に応じて少し下げることができます。これを試して:

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="4000" />
</appSettings>
于 2012-05-24T11:44:56.953 に答える
0

ASP.NET MVCで同じエラーが発生しました。モデルConvertEmptyStringToNull = falseに、モデルのプロパティの属性を設定します。

[DisplayFormat(ConvertEmptyStringToNull = false)]

例えば

public class Person
{
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string Lastname { get; set; }
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string Firstname { get; set; }
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string Middlename { get; set; }
}

この投稿で同じことに遭遇したときに文書化しました:http://www.ienablemuch.com/2011/08/empty-string-is-empty-string.html

于 2012-05-24T12:09:53.663 に答える
0

この http://api.jquery.com/jQuery.post/を使用してください

$.ajax({ type: 'POST', url: url, data: データ, success: 成功, dataType: dataType });

、つまり、略記の Axaj Call ではありません。「成功」、「エラー」、「完了」などのオプションがあり、問題を特定できます。

于 2012-05-24T11:45:15.370 に答える