Asp.net mvc 如何从自定义ModelBinder中调用UpdateModel?(MVC)
我正在为模型中的复杂类型创建一些自定义绑定。我的模型由具有各自独立绑定的对象组成。我希望基础对象完成它的脏活,然后通过传递到标准ModelBinder路由来填充它封装的复杂对象。我该怎么做 为了便于说明,我创建了一个非常简单的示例 假设我的模型包含这些对象Asp.net mvc 如何从自定义ModelBinder中调用UpdateModel?(MVC),asp.net-mvc,asp.net-mvc-2,modelbinders,custom-model-binder,imodelbinder,Asp.net Mvc,Asp.net Mvc 2,Modelbinders,Custom Model Binder,Imodelbinder,我正在为模型中的复杂类型创建一些自定义绑定。我的模型由具有各自独立绑定的对象组成。我希望基础对象完成它的脏活,然后通过传递到标准ModelBinder路由来填充它封装的复杂对象。我该怎么做 为了便于说明,我创建了一个非常简单的示例 假设我的模型包含这些对象 public class Person { public string Name {get; set;} public PhoneNumber PhoneNumber {get; set;} } public class P
public class Person
{
public string Name {get; set;}
public PhoneNumber PhoneNumber {get; set;}
}
public class PhoneNumber
{
public string AreaCode {get; set;}
public string LocalNumber {get; set;}
}
我为每个模型都提供了以下活页夹。并非PersonBinder需要填充PhoneNumber,而是不想在PhoneNumber binder中复制代码。它如何委托回到标准活页夹路线
public class PersonBinder: IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Person person = new Person();
person.Name = bindingContext.ValueProvider.GetValue(String.Format("{0}.{1}", bindingContext.ModelName, "Name")).AttemptedValue
// This is where I'd like to have the PhoneNumber object use binding from another customer ModelBinder.
// Of course the bindingContext.ModelName should be updated to its current value + "PhoneNumber"
person.PhoneNumber = ???; // I don't want to explicitly call the PhoneNumberBinder it should go through standard Binding routing. (ie. ModelBinders.Binders[typeof(PhoneNumber)] = new PhoneNumberBinder();)
return person;
}
}
public class PhoneNumberBinder: IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
PhoneNumber phoneNumber = new PhoneNumber();
phoneNumber.AreaCode = bindingContext.ValueProvider.GetValue(String.Format("{0}.{1}", bindingContext.ModelName, "AreaCode")).AttemptedValue
phoneNumber.LocalNumber = bindingContext.ValueProvider.GetValue(String.Format("{0}.{1}", bindingContext.ModelName, "LocalNumber")).AttemptedValue
return phoneNumber;
}
}
当然,我已经在Global.asax.cs文件中注册了我的ModelBinder
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders[typeof(Person)] = new PersonBinder();
ModelBinders.Binders[typeof(PhoneNumber)] = new PhoneNumberBinder();
}
谢谢
Justin您可以使用AutoMapper并在操作中处理复杂的模型构造,而不是编写活页夹 我设法想出了一个解决办法。请随时评论其有效性
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Person person = new Person();
person.Name = bindingContext.ValueProvider.GetValue("Name").AttemptedValue
if (bindingContext.ModelName == String.Empty)
{
bindingContext.ModelName = "PhoneNumber";
}
else
{
bindingContext.ModelName = bindingContext.ModelName + ".PhoneNumber";
}
PhoneNumber phoneNumber = new PhoneNumber();
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => phoneNumber, phoneNumber.GetType());
IModelBinder binder = ModelBinders.Binders[typeof(PhoneNumber)];
if (binder == null)
{
binder = ModelBinders.Binders.DefaultBinder;
}
person.PhoneNumber = binder.BindModel(controllerContext, bindingContext) as PhoneNumber;
return person;
}
下面是我所做工作的总结
谢谢你的建议,但我不认为汽车制造商是我的工具。似乎是一个解决办法。我相信活页夹应该在本机上支持此功能。