Yus*_*tme 5 c# ajax asp.net-mvc jquery dynamic
如何通过调用来传递dynamic
数据?AJAX
MVC
Controller
Controller
:
public JsonResult ApplyFilters(dynamic filters){
return null;
}
Run Code Online (Sandbox Code Playgroud)
该AJAX
呼叫:
$(':checkbox').click(function (event) {
var serviceIds = $('input[type="checkbox"]:checked').map(function () {
return $(this).val();
}).toArray();
//alert(serviceIds);
$.ajax({
type: 'GET',
url: '/home/ApplyFilters',
data: JSON.stringify({
name: serviceIds
}),
contentType: 'application/json',
success: function (data) {
alert("succeeded");
},
error: function (err, data) {
alert("Error " + err.responseText);
}
});
//return false;
});
Run Code Online (Sandbox Code Playgroud)
理想情况下,filters
它将包含serviceIds
作为属性
比如这样:filters.ServiceIds
.我有一个日期范围的另一个过滤器,并且会添加如下:filters.DateRange
.
服务器端将过滤器作为dynamic
对象ApplyFilters()
据我所知,默认的ASP MVC模型绑定器无法完成这样的事情.
幸运的是有很多解决方案,其中有两个:
1.这是第一个,它将您的JSON数据转换为IDictionary<string, object>
实例,然后将其传递给您的控制器操作.你会最终得到:
public JsonResult ApplyFilters(IDictionary<string, object> filters)
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
2.在第二种方法让您的控制器动作接收JsonValue实例.让你的行动看起来像这样:
public JsonResult ApplyFilters([DynamicJson]JsonValue filters)
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
3.根据之前的教程,您可以创建自己的自定义模型绑定器,返回动态对象.以下代码取自第一个提案并已修改以生成动态对象.这只是为了说明这个想法,不要按原样使用它:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
{
return null;
}
controllerContext.HttpContext.Request.InputStream.Position = 0;
using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
var json = reader.ReadToEnd();
if (string.IsNullOrEmpty(json))
{
return null;
}
dynamic result = new ExpandoObject();
var deserializedObject = new JavaScriptSerializer().DeserializeObject(json) as IDictionary<string, object>;
if (deserializedObject != null)
{
foreach (var item in deserializedObject)
{
((IDictionary<string, object>)result).Add(item.Key, item.Value);
}
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
这些解决方案依赖于构建自定义模型绑定器来处理这种特殊情况:
ModelBinders.Binders.Add
或使用专用属性(CustomModelBinderAttribute))来使用这些特定的自定义模型绑定器.