繁体   English   中英

使用AJAX将动态数据传递给mvc控制器

[英]Pass dynamic data to mvc controller with AJAX

如何通过AJAX调用将dynamic数据传递给MVC Controller

Controller

public JsonResult ApplyFilters(dynamic filters){
   return null;
}

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;
});

理想情况下, filters将包含serviceIds作为属性

例如: filters.ServiceIds 我有一个日期范围的另一个过滤器,并将添加如下: filters.DateRange

服务器端将过滤器作为ApplyFilters()dynamic对象

据我所知, 默认的ASP MVC模型绑定器无法完成这样的事情。

幸运的是有很多解决方案,其中有两个:

1 是第一个,它将您的JSON数据转换为IDictionary<string, object>实例,然后将其传递给您的控制器操作。 你会最终得到:

public JsonResult ApplyFilters(IDictionary<string, object> filters)
{
   return null;
}

2 第二种方法使您的控制器操作能够接收JsonValue实例。 让你的行动看起来像这样:

public JsonResult ApplyFilters([DynamicJson]JsonValue filters)
{
   return null;
}

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

这些解决方案依赖于构建自定义模型绑定器来处理这种特殊情况:

  • 自定义模型绑定器只是IModelBinder接口的一个实现,负责解析JSON发布的数据并将它们转换为另一种格式。
  • ASP MVC框架被告知通过注册它们(使用ModelBinders.Binders.Add或使用专用属性( CustomModelBinderAttribute ))来使用这些特定的自定义模型绑定器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM