【问题标题】:MVC4 JSON Model Binding doesn't workMVC4 JSON 模型绑定不起作用
【发布时间】:2014-05-21 09:59:29
【问题描述】:

使用以下视图模型:

public class GetUsersFromNextCircuitRequest
    {
        public int? dosarId { get; set; }
        public List<int> dosareIds { get; set; }
        public string query { get; set; }
        public int page { get; set; }
        public int page_limit { get; set; }
    }

并在以下操作中使用它:

 public ActionResult GetUsersFromNextCircuit(GetUsersFromNextCircuitRequest requestNextUsers)
        {
         }

并通过以下方式发送请求:

ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
                    url: self.attr('getusersfromnextcircuiturl'),
                    dataType: "json",
                    contentType: 'application/json; charset=utf-8',
                    type: 'POST',
                    traditional: true,
                    data: function (term, page) {
                        if (self.attr('dosare') !== undefined && self.attr('dosare').length > 0) {
                            var dosareIds = [];
                            self.attr('dosare').forEach(function (element, index, list) {
                                dosareIds.push(element.attr('Id'));
                            });
                            return JSON.stringify({
                                    query: term, // search term
                                    page: page,
                                    dosareIds: dosareIds,
                                    page_limit: 30

                            });
                        }
                        else
                            return JSON.stringify({
                                    query: term, // search term
                                    page: page,
                                    dosarId: self.attr('dosarid'),
                                    page_limit: 30

                            });
                    },
                    results: function (data, page) {
                        var more = (page * 30) < data.total; // whether or not there are more results available
                        return { results: data.users, more: more };
                    }
                }

http 请求如下所示:

{"query":"xa","page":1,"dosareIds":[4137,4163],"pagelimit":30}

问题是请求参数为空。我不知道为什么它不起作用。

【问题讨论】:

  • HTTP 请求中的JSON 是错误的,它可能应该是{"query":"xa","page":1,"dosareIds":[4137,4163],"page_limit":30}pagelimit 没有映射到您的模型属性之一)。查看您的代码,它应该设置 page_limit 但不是,也许尝试将名称放入引号中。当我在返回由页面表示的 JSON 对象时遇到问题时,我已经返回到 jQuery serialize 功能并且从那以后我的没有任何问题。我知道 Enumerables 有时可能是 JSON 问题的原因,但我看不出你的问题有什么明显的问题。
  • 我已经将属性名称与 json 有效负载匹配,仍然没有,参数为空。

标签: c# jquery ajax json asp.net-mvc-4


【解决方案1】:

我们遇到了同样的问题,然后我们决定使用 CustomModelBinder。我正在分享我们所做的,

在客户端,

在 ajaxRequest 中,您需要发送整个 ViewModel,如下所示,

        var viewModel = new Object();
        viewModel.query= term;
        viewModel.page= page;
        viewModel.dosareIds= new Array();
        viewModel.dosarIds = dosareIds;
        viewModel.page_limit = 30;

然后将模型字符串化并将其分配给数据,

data: { viewModel: JSON.stringify(viewModel) };

在服务器端,

你可以使用 customModelBinder 取回值

public class CustomJsonModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        try
        {
            var data = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            JavaScriptSerializer js = new JavaScriptSerializer();
            var temp = js.Deserialize(data.AttemptedValue, bindingContext.ModelType);
            return temp;
        }
        catch
        {
            return null;
        }
    }
}

在你的 viewModel 中你需要添加属性,

[ModelBinder(typeof(CustomJsonModelBinder))]
public class GetUsersFromNextCircuitRequest
{
    public int? dosarId { get; set; }
    public List<int> dosareIds { get; set; }
    public string query { get; set; }
    public int page { get; set; }
    public int page_limit { get; set; }
}

现在,CustomJsonModelBinder 将解析该值。我希望它能解决你的问题。

【讨论】:

  • 使用了上面提出的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多