C# jQuery Post后发送给控制器的空值

C# jQuery Post后发送给控制器的空值,c#,jquery,asp.net-mvc,asp.net-mvc-3,razor,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

我有一段代码,试图使用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);
            });
        });
    });
以及返回空值的方式:

$(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; }
}
[JsonObject(MemberSerialization.OptIn)]
公共类事件视图模型
{
公共int事件编号{get;set;}
公共列表事件项{get;set;}
公共列表位置{get;set;}
public int StartLocationID{get;set;}
公共bool出站{get;set;}
公共列表SelectedEvents{get;set;}
公共列表持续时间{get;set;}
}
有人知道为什么会这样吗?回家有限制吗?通过这种方式可以向控制器发送的信息很多-这是一个相当复杂的viewmodel,所以想知道这是否与它有关

谢谢

回家有限制吗?通过这种方式可以向控制器发送的信息很多-这是一个相当复杂的viewmodel,所以想知道这是否与它有关

是的,有1000个HTTP收集密钥,您可以在web.config中自行配置。首先尝试将该值设置为4000,然后如果愿意,可以将其降低一点。试试这个:

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

使用此

$.ajax({ 键入:“POST”, url:url, 数据:数据, 成功:成功, 数据类型:数据类型 });

,我的意思是不是速记Axaj电话。您可以选择“成功”、“错误”、“完成”,并可以隔离问题。

如下:

$(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
我在ASP.NET MVC上遇到了相同的错误。在模型上,将
convertEmptyStringToFull=false
放在模型属性的属性上:

[DisplayFormat(ConvertEmptyStringToNull = false)]
例如


当我在这篇文章中遇到同样的事情时,我做了记录:

你能发布你的
EventViewModel
的结构吗?嗨,Matty-编辑了原始文章以添加结构。有趣的是,我从这篇文章开始,但它根本没有进入控制器操作,这就是我切换到jQuery文章的原因。如果我在ajax调用的正上方插入一个警报,它将触发该警报,但不会触发其他警报。你有没有想过我会错在哪里?你有没有用FireBug检查AJAX请求?看看服务器发送的响应,了解为什么它没有到达控制器。好的想法-设法解决了这个问题,现在它可以工作了。仍然返回空值,但我认为这是出于不同的原因,如果这有意义的话。我会继续查找并报告…好的,我有一些问题要解决,但这几乎就是它。谢谢你的帮助,达林
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; }
}