让我的自定义模型绑定到我的POST控制器

时间:2012-05-17 21:10:46

标签: asp.net-mvc asp.net-mvc-4 model-binding

我正在使用最近发布的MVC 4 Beta(4.0.20126.16343),我正在努力解决一个已知问题,即反序列化/模型绑定无法使用数组(参见Stack Overflow here

我很难让我的显式自定义绑定挂钩。我已经注册了一个客户IModelBinder(或尝试过),但当我的帖子操作被调用时,我的自定义绑定器没有被命中,我只是得到默认的序列化(使用空数组 - 即使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);
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这就是我最终要做的事(感谢Jimmy Bogard在Model binding XML in ASP.NET MVC 3

我将我的解决方案重新打造回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正确匹配时会很好,但这种反序列化的手动绑定方法并不是很麻烦。