0

我在 MVC2 Web 应用程序中使用 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
        {...
4

1 回答 1

0

JsonValueProviderFactory如果要获取 RAW JSON,为什么要使用 a 。这个工厂的重点是将其映射到视图模型(顺便说一句,这是正确的方法)。如果你想获得原始的东西,你总是可以阅读,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)
{
    ...
}
于 2012-07-18T16:24:49.307 回答