使用JsonValueProviderFactory但没有Type接收JSON请求

时间:2012-07-18 16:21:09

标签: json asp.net-mvc-2

我在MVC2网络应用程序中使用JsonValueProviderFactory来处理来自iOS iPad应用程序的入站JSON请求。

我不想将我的JSON映射到一个类型。我只想接收原始JSON并将其传递给模型进行处理。我的控制器操作应该允许我访问传递给控制器​​的原始JSON的签名是什么?

这是迄今为止我尝试过的三个;它们都不起作用:

[ValidateInput(false)] // Allow dodgy chars in the JSON e.g. "<aa>"
        [HttpPost]
        //public ActionResult PushObject(FormCollection form) // no joy
        //public ActionResult PushObject(List<string> parms) // no joy
        //public ActionResult PushObject(string jsonRequest) // no joy
        {...

1 个答案:

答案 0 :(得分:0)

如果您想获得RAW JSON,为什么使用JsonValueProviderFactory?这个工厂的重点是将它映射到一个视图模型(顺便说一下,这是正确的方法)。如果你想获得原始的东西,你总是可以阅读Request.InputStream,但这绝对是可怕的:

public ActionResult Do_Not_Do_This_Please_Use_ViewModels_Instead()
{
    Request.InputStream.Position = 0;
    using (var reader = new StreamReader(Request.InputStream))
    {
        string json = reader.ReadToEnd();
        ...
    }
    ...
}

你至少可以在模型绑定器中隐藏这个废话:

public class RawRequestModelBinder : DefaultModelBinder
{
    public override object  BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        request.InputStream.Position = 0;
        using (var reader = new StreamReader(request.InputStream))
        {
            return reader.ReadToEnd();
        }
    }
}

然后有一个控制器动作:

public ActionResult Do_Not_Do_This_Please_Use_ViewModels_Instead(
    [ModelBinder(typeof(RawRequestModelBinder))] string rawJson
)
{
    ...
}

但当然,正确的方法是使用一个反映iPhone将发送的JSON结构的视图模型:

public ActionResult Foo(MyViewModel model)
{
    ...
}