【问题标题】:Pass dynamic data to mvc controller with AJAX使用 AJAX 将动态数据传递给 mvc 控制器
【发布时间】:2013-11-06 03:21:18
【问题描述】:

如何通过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

而服务器端将过滤器作为dynamic 对象在ApplyFilters()中获取

【问题讨论】:

  • 如果您使用 AJAX 调用来调用操作,过滤器对象会是什么样子?
  • 看起来像这样:{object},无法展开。
  • dynamic 对象在运行时进行评估,因此将返回更改为 return Json(filters) 以便您可以看到响应中返回的实际数据。
  • 没错,但我也可以转换它,因为我已经知道 object 是什么类型。但这失败了,因为某些数据没有传递“好”。

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


【解决方案1】:

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

幸运的是有很多解决方案,这里有两个:

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

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

2second approach 使您的控制器操作能够接收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) 来使用它们。

【讨论】:

  • 但是我已经看到它的工作方式与我在我从事的另一个项目中所描述的完全一样。所以我知道这是 100% 可能的!
  • 但是客户端代码不需要代码重构才能工作吗?
  • 这些自定义模型绑定器期待并解析 JSON。这正是您通过分配“data: JSON.stringify({ name: serviceIds })”向服务器提供的内容。所以不需要客户端代码重构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2016-01-06
  • 2014-12-08
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多