Как вы используете новые классы ModelBinder в ASP.NET MVC Preview 5
-
09-06-2019 - |
Вопрос
Вы заметите, что 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}
}
}
Другие советы
Что ж, я изучил это дело.ASP.NET предоставляет общее местоположение для регистрации реализации IControlBinders.У них также есть основы этой работы с помощью нового контроллера.Метод 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());