Пользовательская модель 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 ());
Другие вопросы по тегам