模型绑定验证错误

时间:2013-03-20 20:56:22

标签: asp.net-mvc-4 model-binding

在我的自定义模型验证中,我有以下内容:

 public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){
        var repository = DependencyResolver.Current.GetService(typeof(IContactRepository));
        IContactRepository repo = repository as IContactRepository;
        USRContact c = repo.GetContactByID(Convert.ToInt64(bindingContext.ValueProvider.GetValue("ContactID").AttemptedValue));
        c.FormalName = bindingContext.ValueProvider.GetValue("FormalName").AttemptedValue;

        if (!repo.IsValidFormalName(c.ContactID, c.FormalName))
        {
            var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            bindingContext.ModelState.AddModelError("FormalName", Resources.ErrorMsgs.FormalNameNotUnique);

            return bindingContext.Model;
        }

        c.PreferredName = bindingContext.ValueProvider.GetValue("PreferredName").AttemptedValue;
        c.Alias = bindingContext.ValueProvider.GetValue("Alias").AttemptedValue;
        c.Pseudonym = bindingContext.ValueProvider.GetValue("Pseudonym").AttemptedValue;
        c.GenderID = Convert.ToInt32(bindingContext.ValueProvider.GetValue("GenderID").AttemptedValue);
        c.NationalityID = Convert.ToInt32(bindingContext.ValueProvider.GetValue("NationalityID").AttemptedValue);
        c.ModifiedByID = Utilities.SessionUtil.Current.UserID;
        c.ModifiedDate = DateTime.Now;

}

我的控制器通过执行以下操作来调用此模型绑定器:

public ActionResult Update([ModelBinder(typeof(ModelBinder.ContactModelBinder))] USR.USRContact contact)
    {
        if (ModelState.IsValid)
        {
            repository.Update();
            return View("~/Views/Shared/Contacts/ShowContactInfo.cshtml", repository.GetContactByID(contact.ContactID));
        }
}

}

我的viewmodel包含数据注释,表示需要正式名称,且别名需要少于60个字符。如果模型绑定器将其转换为持久数据模型(USRContact)并且我的视图期望视图模型,如何显示错误?

有没有办法确保在视图模型上验证错误时,控制器不会转换为持久数据模型?即使我们检查数据对象中的所有模型错误并找到验证错误,我们如何将用户发送回他们刚刚进入的视图,其中包含错误输入的文本框旁边的错误。

感谢您的帮助! Safris

1 个答案:

答案 0 :(得分:0)

我认为您可能面临的问题是,一旦您通过自定义绑定器将这些值推送到另一个对象,它们就不再像在页面上那样。

带有Html.ValidationFor(x => x.PropertyValue)的名为“PropertyValue”的属性将在ModelState错误集合中查找具有PropertyValue的项目。

现在将这些内容推送到Contact中后,值为Contact.PropertyValue。如果你验证了它,它将被添加到ModelState中作为“Contact.PropertyValue”这只会被Html.ValidationFor(x => x.Contact.PropertyValue)选中

最简单的解决方案是确保您的输入和输出遵循相同的结构。如果您可以将项目渲染为Html.TextBoxFor(x => x.Contact.SomeProperty),那么事情就没那问了。