2008-08-29 1 views
1

Sie werden bemerken, dass Preview 5 die folgenden in ihrer Release Notes enthalten:Wie nutzen Sie die neuen Klassen in Modelbinder ASP.NET MVC Preview 5

Zusätzliche Unterstützung für benutzerdefinierte Modell Bindemittel. Mit benutzerdefinierten Ordnern können Sie komplexe Typen als Parameter für eine Aktionsmethode definieren. Um diese Funktion zu verwenden, markieren Sie den komplexen Typ oder die Parameterdeklaration mit [ModelBinder (...)].

Also, wie Sie tatsächlich gehen diese Einrichtung mit, so dass ich so etwas wie diese Arbeit in meinem Controller hat:

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

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

Antwort

2

Nun, ich in diesen sah. ASP.NET bietet einen gemeinsamen Speicherort für die Registrierung der Implementierung von IControlBinders. Sie haben auch die Grundlagen dieser Arbeit über die neue Controller.UpdateModel-Methode.

Also habe ich diese beiden Konzepte im Wesentlichen kombiniert, indem ich eine IModelBinder-Implementierung erstellt habe, die dasselbe wie Controller.UpdateModel für alle öffentlichen Eigenschaften der modelClass tut.

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; 
    } 
} 

In Ihrem Global.asax.cs würden Sie so etwas wie dies hinzufügen müssen:

protected void Application_Start() 
    { 
     ModelBinders.Binders.Add(typeof(Contact), new ModelBinder());