Ну, я посмотрел на это. 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());