题
你会注意到,预5包括以下在他们释放注:
增加支持,用于定义模型的粘合剂。定义的粘合剂,可以定义复杂类型的作为参数,一个动作的方法。使用这一特征,标志着复杂的类型或参数宣言》与[ModelBinder(...)].
那么,你如何去实际上使用这一设施,这样我可以有这样的事情的工作在我的控制器:
public ActionResult Insert(Contact contact)
{
if (this.ViewData.ModelState.IsValid)
{
this.contactService.SaveContact(contact);
return this.RedirectToAction("Details", new { id = contact.ID}
}
}
其他提示
嗯,我看到这一点。ASP.NET 提供了一个共同的位置登记的执行情况IControlBinders.他们也有基本的这一工作通过新的控制器。UpdateModel方法。
因此,我基本上是结合这两个概念,通过创建一个实现IModelBinder,做同样的事情为控制器。UpdateModel用于所有公共性质的modelClass.
public class ModelBinder : IModelBinder
{
public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState)
{
object model = Activator.CreateInstance(modelType);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(model);
foreach (PropertyDescriptor descriptor in properties)
{
string key = modelName + "." + descriptor.Name;
object value = ModelBinders.GetBinder(descriptor.PropertyType).GetValue(controllerContext, key, descriptor.PropertyType, modelState);
if (value != null)
{
try
{
descriptor.SetValue(model, value);
continue;
}
catch
{
string errorMessage = String.Format("The value '{0}' is invalid for property '{1}'.", value, key);
string attemptedValue = Convert.ToString(value);
modelState.AddModelError(key, attemptedValue, errorMessage);
}
}
}
return model;
}
}
在你全球性的。asax.cs你会需要增加像这样的东西:
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(Contact), new ModelBinder());
不隶属于 StackOverflow