使用HttpWebRequest,WebClient等将对象发布到MVC控制器

时间:2012-09-18 11:09:25

标签: asp.net-mvc httpwebrequest

我有这个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#对象并使其可以从控制器操作中使用的正确方法是什么?

1 个答案:

答案 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