1

我有一些代码尝试使用 Ajax 帖子将 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);
            });
        });
    });

以及返回空值的方式:

$(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 的参数传回,所以它看起来像:

$(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")';避免硬编码网址
于 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

使用这个 http://api.jquery.com/jQuery.post/

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

,我的意思不是速记 Axaj Call。您有“成功”、“错误”、“已完成”等选项,并且可以隔离问题。

于 2012-05-24T11:45:15.370 回答
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 回答