ValueProvider中的类型定向序列化

时间:2013-09-30 14:53:01

标签: asp.net-mvc

我希望使用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'参数键入的变量命名方案来派生运行时类型以反序列化。

1 个答案:

答案 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;
    }
  }
}