在jQuery Post之后发送到控制器的空值

时间:2012-05-24 11:41:29

标签: c# jquery asp.net-mvc asp.net-mvc-3 razor

我有一些代码,我正在尝试使用Ajax post将Viewmodel发送回控制器。如果我以一种方式编写代码,它会正确传递,另一种方式是在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的参数,所以它看起来像:

$(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 个答案:

答案 0 :(得分: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")';以避免硬编码网址

答案 1 :(得分:1)

  

家庭是否有限制可以通过这种方式发送到控制器 - 这是一个非常复杂的视图模型,所以想知道这是否与它有关。

是的,它有1000个HTTP收集密钥,您可以在web.config中自行配置。首先尝试将值设置为4000,然后根据需要稍微降低一点。试试这个:

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="4000" />
</appSettings>

答案 2 :(得分:0)

使用它 http://api.jquery.com/jQuery.post/

$。AJAX({   类型:'POST',   url:url,   数据:数据,   成功:成功,   dataType:dataType });

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

答案 3 :(得分:0)

我在ASP.NET MVC上遇到了相同的错误。在您的模型上,您将ConvertEmptyStringToNull = false放在模型的属性属性中:

[DisplayFormat(ConvertEmptyStringToNull = false)]

E.g。

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