2008-08-29 3 views
1

Вы заметите, что изображение 5 включает в себя следующее в своих примечаниях к выпуску:Как использовать новые классы ModelBinder в ASP.NET MVC Preview 5

Добавлена ​​поддержка пользовательских моделей вяжущих. Пользовательские связующие позволяют вам определять сложные типы в качестве параметров для метода действий. Чтобы использовать эту функцию, отметьте сложный тип или объявление параметра с помощью [ModelBinder (...)].

Так как же вы идете по поводу фактического использования этого объекта, так что я могу иметь что-то вроде этой работы в моем контроллере:

public ActionResult Insert(Contact contact) 
{ 
    if (this.ViewData.ModelState.IsValid) 
    { 
     this.contactService.SaveContact(contact); 

     return this.RedirectToAction("Details", new { id = contact.ID} 
    } 
} 

ответ

2

Ну, я смотрел на это. ASP.NET предоставляет общее место для регистрации реализации IControlBinders. У них также есть основы этой работы с помощью нового метода Controller.UpdateModel.

Поэтому я по существу объединил эти две концепции, создав реализацию IModelBinder, которая делает то же самое, что и Controller.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; 
    } 
} 

В вашем Global.asax.cs вам нужно добавить что-то вроде этого:

protected void Application_Start() 
    { 
     ModelBinders.Binders.Add(typeof(Contact), new ModelBinder()); 
Смежные вопросы