如何将json作为对象传递给ASP.NET MVC控制器?

时间:2017-01-27 13:06:42

标签: c# asp.net json asp.net-mvc

我有一个动作

[HttpGet]
public ActionResult Index(MyObject obj)
{
   return View(obj);
}

和一个对象:

 [JsonObject(MemberSerialization = MemberSerialization.OptIn)]
 public class MyObject
 {
    [JsonProperty(PropertyName = "someString")]
    public String SomeString
    {
        get { return _someString; }
        set { _someString = value; }
    }

    [JsonProperty(PropertyName = "someDictionary")]
    public IDictionary SomeDictionary
    {
        get { return _someDictionary; }
        set { _someDictionary = value; }
    }

    public MyObject()
    {
    }

    private String _someString;
    private IDictionary _someDictionary;
  }

我想通过url将此对象传递给action。所以我创建了url:

String url =  controller.Url.Action("Index", "SomeController");
url += "?obj=" + JsonConvert.SerializeObject(myObjectInstance);

它用json创建了一个url,但是当我使用它时 - url中的对象为null。

有人能帮助我吗?

谢谢!

更新: 分享MyObject的实例作为对评论的反应:

MyObject myObjectInstance = new MyObject ();
myObjectInstance.SomeString = "Hello";
myObjectInstance.SomeDictionary = new Dictionary<String, Object> 
{
   {"firstKey","value"}, 
   {"secondValue",5}
}

2 个答案:

答案 0 :(得分:0)

modelbinder能够反序列化JSON。换句话说,你不需要做任何特别的事情。如果您的请求正文包含JSON(不是JSON 字符串,请注意,但是具有JSON mimetype的实际JSON对象),那么只要它可以将数据绑定到action参数,将。换句话说,您需要做的就是构造一个或多个C#类来表示JSON对象。例如,给定一个JSON对象,如:

{
    'foo': 'bar',
    'bar': 1
}

你需要一个类:

public class MyClass
{
    public string Foo { get; set; }
    public int Bar { get; set; }
}

然后,这会进入你的行动签名:

public ActionResult MyAction(MyClass foo)

模型绑定器将新建一个MyClass实例,并将JSON数据绑定到相关属性上。

答案 1 :(得分:-1)

除了你不应该从事这种恶劣行为这一事实(你应该只在链接中传递对象的ID)......从技术上讲,你可以这样做:

public ActionResult Index(string myObjectJson)
{
     var myObject = Json.Deserialize<MyObject>(myObjectJson);