3

我正在使用最近发布的 MVC 4 Beta (4.0.20126.16343) 并且正在努力解决反序列化/模型绑定不适用于数组的已知问题(请参阅此处的堆栈溢出

我很难让我的显式自定义绑定连接起来。我已经注册了一个自定义 IModelBinder(或尝试注册),但是当我的 post 操作被调用时,我的自定义活页夹没有被击中,我只是获得了默认的序列化(使用空数组 - 即使 wireshark 向我显示传入的复杂对象包含数组元素)。

我觉得我错过了一些东西,并且非常感谢任何解决方案或见解。

谢谢。

来自 global.asax.cs:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

protected void Application_Start()
{
    ModelBinders.Binders.Add(typeof(DocuSignEnvelopeInformation), new DocusignModelBinder());
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
}

和我的自定义活页夹:

public object BindModel(ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext)
{
    var value = bindingContext.ValueProvider.GetValue("envelope");

    var model = new DocuSignEnvelopeInformation();

    //build out the complex type here

    return model;
}

我的控制器只是:

public void Post(DocuSignEnvelopeInformation envelope)
{
    Debug.WriteLine(envelope);
}
4

2 回答 2

2

通常我们通过 DI 容器注册我们的模型绑定器并且它可以工作。使用 DependencyResolver 使用的 DI 容器注册 IModelBinderProvider 并在 GetBinder 方法中从那里返回您的 ModelBinder。

于 2012-05-18T19:33:03.967 回答
1

这就是我最终做的事情(感谢 Jimmy Bogard在 ASP.NET MVC 3 中的模型绑定 XML 中

我将我的解决方案重新回到 MVC 3。(再次被发布前的焦虑所困扰)

添加了一个 ModelBinderProvider:

public class XmlModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(Type modelType)
    {
        var contentType = HttpContext.Current.Request.ContentType;

        if (string.Compare(contentType, @"text/xml",
            StringComparison.OrdinalIgnoreCase) != 0)
        {
            return null;
        }

        return new XmlModelBinder();
    }
}

和一个 ModelBinder

public class XmlModelBinder : IModelBinder
{
    public object BindModel(
        ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        var modelType = bindingContext.ModelType;
        var serializer = new XmlSerializer(modelType);

        var inputStream = controllerContext.HttpContext.Request.InputStream;

        return serializer.Deserialize(inputStream);
    }
}

并将其添加到 Application_Start():

    ModelBinderProviders.BinderProviders
    .Add(new XmlModelBinderProvider());

我的控制器与问题中的完全相同。

像一种享受一样工作。当新的“无字符串”方法与 MVC 4 一起正确到达时会很棒,但是这种反序列化的手动绑定方法并不十分繁琐。

于 2012-05-22T13:11:45.887 回答