我在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
{...
答案 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)
{
...
}