Пользовательская модель Binder не обновляется
Я работал над проектом MVC, который имеет сложную модель с несколькими вложенными классами, и в один класс вложен другой класс. Я могу заставить все другие сложные типы корректно обновляться, но последний никогда не обновляется корректно. Я удостоверился, что зарегистрировал свой пользовательский механизм связывания модели, который выполняется и возвращает объект с правильными значениями, назначенными его свойствам, но исходная модель никогда не обновляется.
Я вырезал все, что работает, оставив мою структуру только ниже:
Классы
public class Case
{
public Case()
{
PersonOfConcern = new Person();
}
public Person PersonOfConcern { get; set; }
}
[ModelBinder(typeof(PersonModelBinder))]
public class Person
{
public Person()
{
NameOfPerson = new ProperName();
}
public ProperName NameOfPerson { get; set; }
}
[TypeConverter(typeof(ProperNameConverter))]
public class ProperName : IComparable, IEquatable<string>
{
public ProperName()
: this(string.Empty)
{ }
public ProperName(string fullName)
{
/* snip */
}
public string FullName { get; set; }
}
Модель Binder
public class PersonModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(Person))
{
HttpRequestBase request = controllerContext.HttpContext.Request;
string prefix = bindingContext.ModelName + ".";
if (request.Form.AllKeys.Contains(prefix + "NameOfPerson"))
{
return new Person()
{
NameOfPerson = new ProperName(request.Form.Get(prefix + "NameOfPerson"))
};
}
}
return base.BindModel(controllerContext, bindingContext);
}
}
контроллер
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
if (CurrentUser.HasAccess)
{
Case item = _caseData.Get(id);
if (TryUpdateModel(item, "Case", new string[] { /* other properties removed */ }, new string[] { "PersonOfConcern" })
&& TryUpdateModel(item.PersonOfConcern, "Case.PersonOfConcern"))
{
// ... Save here.
}
}
}
Я в конце своего ума. PersonModelBinder
выполняется и возвращает правильный набор значений, но модель никогда не обновляется. Что мне здесь не хватает?
1 ответ
Я думаю, что вы должны добавить его в глобальный asax на Application_Start
ModelBinders.Binders.Add(typeof(PersonModelBinder ), new PersonModelBinder ());