ASP.NET MVC 如何将JSON对象从视图传到控制器作为参数

 2023-02-17    360  

问题描述

我有一个复杂的json对象,它被发送到视图,没有任何问题(如下所示),但是当我通过ajax调用将此数据返回到.NET对象时,我无法计算出序列化. .各个部件的细节如下.

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

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

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

            }

        ]
    };

我不确定该对象如何传递给控制器​​方法,我在下面的方法下面有这个方法,其中timelines对象镜像使用属性镜像上述js对象.

ASP.NET MVC 如何将JSON对象从视图传到控制器作为参数

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虽如asp.net mvc?或以这种方式传递数据的最佳实践是什么?

推荐答案

编辑:

此方法不再需要到达MVC 3的到达,因为它将自动处理 – http://weblogs.asp.net/scottgu/archive/2010/07/27/introdute-asp-net-mvc-3 – 预览-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”,这将弹出到动作,并将值映射到您指定的类型的对象.

其他推荐答案

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

$.ajax的 datatype 告诉jquery服务器将的类型是什么类型返回,而不是您通过的东西.帖子只能通过表格. jQuery 将数据转换为键/值对并将其传递为查询字符串.来自文档:

要发送到服务器的数据.它是
转换为查询字符串,如果不是
已经是一个字符串.它附加到了
获取请求的URL.请参阅ProcessData.
可防止此自动的选项
加工.对象必须是键/值
对.如果值是数组,jQuery
用相同序列化多个值
键i.e. {foo:[“bar1″,”bar2”]}
变成’&foo = bar1&foo = bar2′.

因此:

  1. 您不会将JSON传递给服务器.你将json传递给jquery.
  2. 模型绑定发生在任何其他案例中发生的方式相同.

其他推荐答案

使用简单的jQuery插件

虽然这个问题的答案很长,但我仍然发布了一个很好的解决方案,我在一段时间内伴随着,它使得将复杂的json发送到ASP.NET MVC 控制器操作使它们是绑定到任何强类型参数的模型.

这个插件支持日期也是如此,因此他们会转换为他们的DateTime对应物而没有问题.

您可以在我的博文我在哪里检查问题并提供完成此操作所需的代码.

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

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

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

以上所述是小编给大家介绍的ASP.NET MVC 如何将JSON对象从视图传到控制器作为参数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34243.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。