Come si utilizzano le nuove classi ModelBinder in ASP.NET MVC Preview 5

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

  •  09-06-2019
  •  | 
  •  

Domanda

Noterai che l'Anteprima 5 include quanto segue nelle note di rilascio:

Aggiunto supporto per raccoglitori di modelli personalizzati.I raccoglitori personalizzati consentono di definire tipi complessi come parametri per un metodo di azione.Per utilizzare questa funzionalità, contrassegnare il tipo complesso o la dichiarazione del parametro con [ModelBinder(…)].

Allora come si fa a utilizzare effettivamente questa funzionalità in modo che io possa avere qualcosa di simile a questo lavoro nel mio controller:

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

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

Altri suggerimenti

Beh, ho esaminato questo.ASP.NET fornisce un percorso comune per la registrazione dell'implementazione di IControlBinders.Hanno anche le basi per questo funzionamento tramite il nuovo metodo Controller.UpdateModel.

Quindi ho essenzialmente combinato questi due concetti creando un'implementazione di IModelBinder che fa la stessa cosa di Controller.UpdateModel per tutte le proprietà pubbliche di 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;
    }
}

Nel tuo Global.asax.cs dovresti aggiungere qualcosa del genere:

    protected void Application_Start()
    {
        ModelBinders.Binders.Add(typeof(Contact), new ModelBinder());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top