asp.net MVC 3 - 在paramterized控制器方法中读取POST有效负载

时间:2012-05-24 15:56:40

标签: asp.net-mvc

我有

[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添加'thing',但我真的不喜欢那个

1 个答案:

答案 0 :(得分:3)

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

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在his blog post中所说明的那样,将自己的工厂添加到自己的工作中非常容易。