在我的自定义模型验证中,我有以下内容:
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
答案 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),那么事情就没那问了。