【问题标题】:Getting my Custom Model bound to my POST controller让我的自定义模型绑定到我的 POST 控制器
【发布时间】:2012-05-25 11:51:57
【问题描述】:

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

我很难让我的显式自定义绑定连接起来。我已经注册了一个自定义 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);
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。出于不值得探讨的原因,我们不会沿着 DI 路径走下去,所以这个选项对我来说不可用。当然值得投票,但我会推迟标记为答案,因为我真的很喜欢“示例代码”风格的答案。我怀疑我真正的答案是等待 MVC 4 的下一个(RC?)版本,据说它包含自动绑定的修复。
    【解决方案2】:

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

    我将我的解决方案重新回到 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();
        }
    }
    

    还有一个模型绑定器

    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 中正确出现时会很棒,但是这种反序列化的手动绑定方法并不十分繁琐。

    【讨论】:

    • 我将继续并将我自己的答案标记为已接受 - 因为这是我所做的并且它有效。如果您有任何相关的想法,请随时添加任何内容。
    猜你喜欢
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2012-02-18
    • 2012-07-31
    相关资源
    最近更新 更多