首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JSON如何将ASP.NET对象作为参数从视图传递到控制器

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

Stack Overflow用户
提问于 2009-02-18 10:49:07
回答 2查看 114.7K关注 0票数 54

我有一个复杂的JSON对象,它被发送到视图时没有任何问题(如下所示),但我不知道如何在通过AJAX调用将此数据传递回控制器时将其序列化为.NET对象。下面是各个部分的详细信息。

代码语言:javascript
复制
   var ObjectA = {
        "Name": 1,
        "Starting": new Date(1221644506800),

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

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

            }

        ]
    };

我不确定如何将此对象传递给Controller方法,我在下面的方法中使用了Timeline对象使用Properties来镜像上面的JS对象。

代码语言:javascript
复制
public JsonResult Save(Timelines person)

我使用的jQuery是:

代码语言:javascript
复制
        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();
            }
        });

我见过这个类似的问题,但不完全相同,因为我不是使用表单来操作数据。How to pass complex type using json to ASP.NET MVC controller

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

EN

回答 2

Stack Overflow用户

发布于 2009-02-18 15:24:54

您也可以使用JavaScriptSerializer类。这将允许您将json反序列化为.NET对象。有一个通用的Deserialize<T>,尽管您需要.NET对象具有与javascript对象类似的签名。此外,还有一个只生成普通objectDeserializeObject方法。然后,您可以使用反射来获取所需的属性。

如果您的控制器采用FormCollection,并且您没有向data添加任何其他内容,则json应该在form[0]

代码语言:javascript
复制
public ActionResult Save(FormCollection forms) {
  string json = forms[0];
  // do your thing here.
}
票数 4
EN

Stack Overflow用户

发布于 2010-11-11 04:42:21

此答案是DaRKoN_使用object filter的答案的后续:

代码语言:javascript
复制
[ObjectFilter(Param = "postdata", RootType = typeof(ObjectToSerializeTo))]
    public JsonResult ControllerMethod(ObjectToSerializeTo postdata) { ... }

我遇到了一个问题,如何向一个action方法发送多个参数,其中一个是json对象,另一个是普通字符串。我是MVC的新手,我刚刚忘记我已经用非ajaxed视图解决了这个问题。

如果我需要一个视图上的两个不同的对象,我会怎么做。我会创建一个ViewModel类。因此,假设我需要person对象和address对象,我将执行以下操作:

代码语言:javascript
复制
public class SomeViewModel()
{
     public Person Person { get; set; }
     public Address Address { get; set; }
}

然后,我会将视图绑定到SomeViewModel。您可以使用JSON做同样的事情。

代码语言:javascript
复制
[ObjectFilter(Param = "jsonViewModel", RootType = typeof(JsonViewModel))] // Don't forget to add the object filter class in DaRKoN_'s answer.
public JsonResult doJsonStuff(JsonViewModel jsonViewModel)
{
     Person p = jsonViewModel.Person;
     Address a = jsonViewModel.Address;
     // Do stuff
     jsonViewModel.Person = p;
     jsonViewModel.Address = a;
     return Json(jsonViewModel);
}

然后在视图中,您可以对JQuery使用一个简单的调用,如下所示:

代码语言:javascript
复制
var json = { 
    Person: { Name: "John Doe", Sex: "Male", Age: 23 }, 
    Address: { Street: "123 fk st.", City: "Redmond", State: "Washington" }
};

$.ajax({
     url: 'home/doJsonStuff',
     type: 'POST',
     contentType: 'application/json',
     dataType: 'json',
     data: JSON.stringify(json), //You'll need to reference json2.js
     success: function (response)
     {
          var person = response.Person;
          var address = response.Address;
     }
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/560575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档