我有一个动作
[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}
}
答案 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);