asp.net MVC 3 - 以参数化控制器方法读取POST有效负载

我有

[HttpPost]        
public ActionResult Foo()
{
   //read HTTP payload
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
 ....
}

有效载荷是application/json;工作得很好;然后我改变了

public ActionResult Foo(string thing)
{
....
}

打算发布到 MyController/Foo?thing = yo 现在我无法读取有效载荷(长度正确,但流是空的)。我的猜测是,控制器管道已经吃掉了有效载荷,寻找可以映射到方法参数的表单发布数据。有没有什么方法可以阻止这种行为(当然,MVC不应该吃掉其类型标记为JSON的有效载荷,它只应该查看表单发布数据)。我的工作是向json添加'东西',但我真的不喜欢那样

0
额外 编辑
意见: 1

1 答案

在阅读之前尝试重置输入流位置:

public ActionResult Foo(string thing)
{
    Request.InputStream.Position = 0;
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
    ....
}

这就是说,如果你发送一个 application/json 有效载荷,为什么在圣地上你难以直接读取请求流而不是简单地定义和使用视图模型:

public class MyViewModel
{
    public string Thing { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
    ...
}

接着:

public ActionResult Foo(MyViewModel model)
{
   //use the model here 
    ....
}

ASP.NET MVC 3有一个内置的 JsonValueProviderFactory ,它允许您自动将JSON请求绑定到模型。如果你使用的是旧版本,你可以很容易地添加你自己的工厂,比如Phil Haack在他的博客文章

0
额外
ty关于你的“为什么在地球上......”,在我的情况下是没有意见或模型的。我的电话都是纯粹的AJAX呼叫。我只是将MVC的C部分用作'REST'服务器端的一个很好的框架。微软的JSON支持对于复杂的类型也不好,我使用json.net代替
额外 作者 pm100,
Request.InputStream.Position = 0;是一个有效的答案。
额外 作者 Max Favilli,