我有这个api控制器动作,它将一个对象“ContentList”作为参数。
[HttpPost]
public List<string> SendList(string param, ContentList list)
{
List<string> testReturn = new List<string> { "test1", "test2", "test3", "test4" };
return testReturn ;
}
到目前为止,我所尝试的是调用这样的控制器动作:
Uri _uri = new Uri("http://localhost:xxxxx/api/FakeTest/SendList?param=test");
var serializer = new JavaScriptSerializer();
string requestData = serializer.Serialize(new
{
list = ContentList,
});
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = "application/json";
var result = client.UploadData(_uri, Encoding.UTF8.GetBytes(requestData));
var tempString = Encoding.UTF8.GetString(result);
}
在此示例中,tempString = [“test1”,“test2”,“test3”,“test4”]由控制器操作重新生成..
在控制器动作中,我可以访问传入的ContentList的属性,并返回它们的值(相应地改变动作返回值)。
但是,在控制器操作中,我需要发送ContentList对象以进行进一步处理,这似乎失败了。我得到一个500内部服务器错误,我不能在控制器中设置一个断点来跟随传入的值。调试器永远不会命中它......
我希望这与将json发送到控制器操作有关。
无论如何,似乎ContentList被从控制器动作发送到的代码拒绝,所以我想我需要进行某种反序列化,对吧?
Bottomline,问题是,从代码调用控制器操作,传入C#对象并使其可以从控制器操作中使用的正确方法是什么?
答案 0 :(得分:0)
如果您使用的是MVC 3,您的控制器应该能够直接显示和解析json数据。如果您正在使用MVC 2,则需要在应用程序上注册一个新工厂以处理控制器上的json解析
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
}
此处有关此主题的更多信息: http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx