我正在使用最近发布的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);
}
答案 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正确匹配时会很好,但这种反序列化的手动绑定方法并不是很麻烦。