【问题标题】:How to pass json as object to ASP.NET MVC controller?如何将 json 作为对象传递给 ASP.NET MVC 控制器?
【发布时间】:2017-01-27 13:06:42
【问题描述】:

我有一个动作

[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 将此对象传递给操作。所以我创建了网址:

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

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

谁能帮帮我?

谢谢!

更新: 分享我的 MyObject 实例作为对 cme​​ts 的反应:

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

【问题讨论】:

  • 如果您尝试通过重定向传递对象,这可能对How do I include a model with a RedirectToAction? 有所帮助
  • 不能在 URL.Action 方法中直接使用对象本身吗?即string url = controller.Url.Action("Index", "SomeController", myObjectInstance);msdn.microsoft.com/en-us/library/…
  • 艾迪森。太近了,对象是绑定的,但是没有IDictionary对象
  • Shyju,谢谢。我想到了 PRG Pattern 之类的东西,因为在我的情况下我不能使用 TempData
  • 如果你想绑定到Dictionary,那么数据需要采用正确的格式——参考this answer——你甚至没有指出你的myObjectInstance数据是什么!

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


【解决方案1】:

modelbinder 能够反序列化 JSON。换句话说,你不需要做任何特别的事情。如果您的请求正文由 JSON 组成(不是 JSON string 请注意,而是具有 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)

modelbinder 将新建一个 MyClass 实例并将 JSON 数据绑定到相关属性。

【讨论】:

    【解决方案2】:

    除了你永远不应该从事这种残暴行为(你应该只在链接中传递对象的 ID)之外......从技术上讲,你可以这样做:

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

    【讨论】:

    • 是的,我知道,我可以做到,但它不是美丽的解决方案,但感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多