ASP.NET MVC如何将View中的JSON对象作为参数传递给Controller?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (86)

我有一个复杂的JSON对象,发送给视图没有任何问题(如下所示),但我不能解决如何通过AJAX调用将该数据序列化回.NET对象。各部分的细节如下。

   var ObjectA = {
        "Name": 1,
        "Starting": new Date(1221644506800),

        "Timeline": [
            {
                "StartTime": new Date(1221644506800),
                "GoesFor": 200

            }
            ,
            {
                "StartTime": new Date(1221644506800),
                "GoesFor": 100

            }

        ]
    };

我不知道如何将这个对象传递给控制器​​方法,我在下面的时间轴对象使用属性镜像上述JS对象的方法。

public JsonResult Save(Timelines person)

我使用的jQuery是:

        var encoded = $.toJSON(SessionSchedule);

        $.ajax({
            url: "/Timeline/Save",
            type: "POST",
            dataType: 'json',
            data: encoded,
            contentType: "application/json; charset=utf-8",
            beforeSend: function() { $("#saveStatus").html("Saving").show(); },
            success: function(result) {
                alert(result.Result);
                $("#saveStatus").html(result.Result).show();
            }
        });

我已经看到这个问题是相似的,但不完全相同,因为我没有使用表单来操纵数据。

我也看到了使用'JsonFilter'手动反序列化JSON的引用,但想知道是否有办法通过ASP.NET MVC进行本地化?或者以这种方式传递数据的最佳做法是什么?

提问于
用户回答回答于

随着MVC 3的到来,不再需要此方法,因为它将自动处理 - http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3 -preview-1.aspx

你可以使用这个ObjectFilter:

    public class ObjectFilter : ActionFilterAttribute {

    public string Param { get; set; }
    public Type RootType { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json")) {
            object o =
            new DataContractJsonSerializer(RootType).ReadObject(filterContext.HttpContext.Request.InputStream);
            filterContext.ActionParameters[Param] = o;
        }

    }
}

然后,可以将其应用于您的控制器方法,如下所示:

    [ObjectFilter(Param = "postdata", RootType = typeof(ObjectToSerializeTo))]
    public JsonResult ControllerMethod(ObjectToSerializeTo postdata) { ... }

所以基本上,如果这篇文章的内容类型是“application / json”,那么这将会启动并将这些值映射到您指定的类型的对象。

用户回答回答于

你说“我不使用表单来操纵数据。” 但你正在做一个POST。因此,实际上,即使它是空的,也使用表单。

$ .ajax的dataType告诉jQuery服务器将返回什么类型,而不是你传递的是什么。POST只能传递一个表单。jQuery 将数据转换为键/值对并将其作为查询字符串传递。从文档:

要发送到服务器的数据。它被转换成查询字符串,如果还不是字符串的话。它附加到GET请求的url。请参阅processData选项以防止此自动处理。对象必须是键/值对。如果value是一个数组,则jQuery使用相同的键序列化多个值,即{foo:[“bar1”,“bar2”]}变为'&foo = bar1&foo = bar2'。

因此:

  1. 没有将JSON传递给服务器。正在将JSON传递给jQuery。
  2. 模型绑定发生的方式与其他任何情况下发生的一样。

扫码关注云+社区