Wie verwenden Sie die neuen ModelBinder-Klassen in ASP.NET MVC Preview 5?

StackOverflow https://stackoverflow.com/questions/34709

  •  09-06-2019
  •  | 
  •  

Frage

Sie werden feststellen, dass Preview 5 Folgendes in den Versionshinweisen enthält:

Unterstützung für benutzerdefinierte Modellordner hinzugefügt.Mit benutzerdefinierten Bindemitteln 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(…)].

Wie gehen Sie also vor, um diese Funktion tatsächlich zu nutzen, damit in meinem Controller so etwas funktioniert:

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

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

Andere Tipps

Nun, ich habe mir das angesehen.ASP.NET bietet einen gemeinsamen Speicherort für die Registrierung der Implementierung von IControlBinders.Sie verfügen auch über die Grundlagen dieser Funktionsweise über die neue Methode Controller.UpdateModel.

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

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 Ihrer Global.asax.cs müssten Sie so etwas hinzufügen:

    protected void Application_Start()
    {
        ModelBinders.Binders.Add(typeof(Contact), new ModelBinder());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top