自定义模型绑定程序未更新



我一直在做一个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; }
}

模型粘合剂

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将执行并返回正确的值集,但模型永远不会更新。我在这里错过了什么?

我认为您应该将其添加到全局 ASAX 中Application_Start

 ModelBinders.Binders.Add(typeof(PersonModelBinder ), new PersonModelBinder ());

相关内容

  • 没有找到相关文章

最新更新