【问题标题】:null values sent to controller after jQuery PostjQuery Post 后发送到控制器的空值
【发布时间】:2012-05-24 11:41:29
【问题描述】:

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

以及返回空值的方式:

$(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; }
}

有人知道为什么会发生这种情况吗?通过这种方式可以向控制器发送多少内容是否有限制 - 这是一个相当复杂的视图模型,所以想知道这是否与它有关。

谢谢

【问题讨论】:

  • 你能把你的EventViewModel的结构贴出来吗?
  • 嗨 Matty - 编辑原始帖子以添加结构。

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


【解决方案1】:

像这样:

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

【讨论】:

  • 有趣的是,我从这个开始,但它根本没有进入控制器操作,这就是我切换到 jQuery post 的原因。如果我在 ajax 调用上方发出警报,它会触发它,但没有别的。有什么想法我可能会出错吗?
  • 您是否使用 FireBug 检查了 AJAX 请求?查看服务器发送的响应,了解为什么它没有到达控制器。
  • 好主意 - 设法解决了这个问题,它现在可以工作了。仍然带回空值,但我认为现在有不同的原因,如果这有意义的话。将继续寻找并报告...
  • 好的,我有一些问题需要解决,但差不多就是这样。感谢您的帮助达林
【解决方案2】:

通过这种方式可以向控制器发送多少内容是否有限制 - 这是一个相当复杂的视图模型,所以想知道这是否与它有关。

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

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

【讨论】:

    【解决方案3】:

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

    $.ajax({ 类型:'POST', 网址:网址, 数据:数据, 成功:成功, 数据类型:数据类型 });

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

    【讨论】:

      【解决方案4】:

      我在 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

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多