你会注意到,预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());
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top