当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ASP.NETMVC如何将JSON对象从View传递给Controller作为参数》经验,为你挑选了3个好方法。

我有一个复杂的JSON对象,它被发送到View没有任何问题(如下所示)但我无法弄清楚如何通过AJAX调用将这些数据序列化回.NET对象.各部分的细节如下.

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

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

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

            }

        ]
    };

我不确定如何将此对象传递给Controller方法,我在下面使用此方法,其中Timelines对象使用Properties镜像上述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();
            }
        });

我已经看到这个问题类似,但不完全相同,因为我没有使用表单来操纵数据. 如何使用json将复杂类型传递给ASP.NET MVC控制器

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



1> ChadT..:

编辑:

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",这将会生效,并将值映射到您指定的类型的对象.


我正在使用这种方法来实现相同的东西,但由于某种原因,我在ReadObject方法上得到一个例外:"期望元素'root'来自命名空间''..遇到'无',名称为'',名称空间''. " 有什么想法吗?

2> Craig Stuntz..:

你说"我没有使用表单来操纵数据." 但你正在做一个POST.因此,实际上,您使用的是表格,即使它是空的.

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

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

因此:

    您没有将JSON传递给服务器.你将JSON传递给jQuery.

    模型绑定的发生方式与任何其他情况下的相同.


不,他没有使用表格; "实际上与否".他正在发送带有POST动词的HTTP请求.哪些可能使用或不使用表单,可能是RESTful服务调用等.

3> Robert Korit..:

使用简单的jQuery插件的另一种看法

虽然这个问题的答案早就应该解决了,但是我仍然发布了一个很好的解决方案,这个解决方案是我前面提到的,并且很容易将复杂的JSON发送到Asp.net MVC控制器操作,因此它们是模型绑定到任何强大的类型参数.

这个插件也支持日期,因此它们可以DateTime毫无问题地转换为对应日期.

您可以在我的博客文章中找到我检查问题的所有详细信息,并提供完成此操作所需的代码.

您所要做的就是在客户端使用此插件.Ajax请求看起来像这样:

$.ajax({
    type: "POST",
    url: "SomeURL",
    data: $.toDictionary(yourComplexJSONobject),
    success: function() { ... },
    error: function() { ... }
});

但这只是整个问题的一部分.现在我们可以将复杂的JSON发布回服务器,但由于它将模型绑定到可能在属性上具有验证属性的复杂类型,因此事情可能会失败.我也有一个解决方案.我的解决方案利用了jQuery Ajax功能,其结果可能是成功的或错误的(正如上面的代码所示).因此,当验证失败时,error函数将被调用,因为它应该是.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有