我希望使用MS.NET MVC的ValueProvider工具封装我的json api的所有序列化逻辑。
但是,由于我的反序列化是类型定向的(即它需要知道从反序列化返回什么类),并且我只是找不到合理的方法来获取我的ValueProvider应该返回的类型。
假设我们有一个控制器:
public class MyController : Controller
{
// We want obj to be instantiated by MyValueProvider
public ActionResult MyAction(MyComplexObject obj)
{
}
}
我希望能够写下什么:
public class MyValueProvider : IValueProvider
{
public bool ContainsPrefix(string prefix)
{
...
}
public ValueProviderResult GetValue(string key)
{
switch (req.HttpMethod)
{
case "POST":
{
req.InputStream.Position = 0;
T retObj = MyDeserialize<T>(req.InputStream);
return new ValueProviderResult(retObj, key, CultureInfo.CurrentCulture);
}
break;
default:
return null;
}
}
}
(虽然我意识到如果没有在MyValueProvider中实际绑定T,我将不得不使用反射来使用运行时提供的类型调用MyDeserialize)
我几乎正在考虑使用一些由GetValue的'key'参数键入的变量命名方案来派生运行时类型以反序列化。
答案 0 :(得分:0)
在花了半天思考这个,然后阅读http://ishwor.cyberbudsonline.com/2012/07/fun-with-aspnet-mvc-3-custom-json-model-binder.html之后,我得出的结论是我需要的实际上是一个ModelBinder,因为ModelType在BindingContext中可用。
因此,问题中的ValueProvider变为:
public class MyModelBinder<T> : IModelBinder
{
public object BindModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
JToken resTok;
var key = bindingContext.ModelName;
var req = controllerContext.HttpContext.Request;
if (bindingContext.ModelType != typeof(T)) return null;
switch (req.HttpMethod)
{
case "POST":
req.InputStream.Position = 0;
T retObj = MyDeserialize<T>(req.InputStream);
return retObj;
break;
default:
return null;
}
}
}