C# MVC4 JSON模型绑定不';行不通
使用以下Viewmodel:C# MVC4 JSON模型绑定不';行不通,c#,jquery,ajax,json,asp.net-mvc-4,C#,Jquery,Ajax,Json,Asp.net Mvc 4,使用以下Viewmodel: 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 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; }
}
并通过以下方式发送请求:
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 };
}
}
问题是请求参数为null。我不知道为什么它不起作用。我们遇到了同样的问题,然后我们决定使用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; }
}
[ModelBinder(typeof(CustomJsonModelBinder))]
公共类GetUsersFromNextCircuitRequest
{
公共int?dosand{get;set;}
公共列表dosareds{get;set;}
公共字符串查询{get;set;}
公共整型页{get;set;}
公共整型页面_限制{get;set;}
}
现在,CustomJsonModelBinder将解析该值。我希望它能解决您的问题。HTTP请求中的
JSON
是错误的,它可能应该是{“查询”:“xa”,“page”:1,“dosareIds”:[41374163],“page_limit”:30}
(pagelimit
没有映射到您的模型属性之一)。查看您的代码,它应该设置page\u limit
,但不是,也许可以尝试将名称用引号括起来。当我在返回由页面表示的JSON对象时遇到问题时,我已经返回到jQueryserialize
功能,从那以后我就再也没有遇到任何问题。我知道枚举有时可能是导致JSON
问题的原因,但我看不出您的问题有任何明显的错误。我已将属性名称与JSON负载匹配,但仍然没有任何结果,参数为null。使用了上面提出的解决方案。
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;
}
}
}
[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; }
}