asp.NET MVC 2 DataAnnotations的UpdateModel 验证
-
19-09-2019 - |
题
我试图使用DataAnnotations来验证添加到我的asp.NET MVC 2 RC2机型,采用TryUpdateModel
var user = UserManager.Find(id);
this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());
该更新模型,但验证永远不会被调用。我尝试使用TryUpdateModel以及(这是直接类型的用户),而不是使用表格值提供者,直接使用ProvisioningObject(其具有验证元数据),但没有成功。
谷歌搜索实例仅仅给我的方式通过一个参数
结合使用DataAnnotationspublic ActionResult Update(User user)
哪些我不喜欢用于更新方案。
任何提示和/或溶液?
修改强> 我的对象是从WCF服务自动生成的对象。
我提出的partials能够添加DataAnnotations。 我叫TryUpdateModel三次,因为它显然不支持继承,这一点我觉得也是我问题DataAnnotations。我指定ProvisioningObject验证属性,绑定不找这样的继承的东西。
[MetadataType(typeof(ProvisioningObjectMetadata))]
public partial class ProvisioningObject : IProvisioningObject
{
public string DisplayNameInvariant { get { return string.IsNullOrEmpty(this.DisplayName) ? this.Name : this.DisplayName; } }
}
[MetadataType(typeof(UserMetadata))]
public partial class User : IUser
{
}
public class ProvisioningObjectMetadata
{
[DisplayName("Country")]
public string CountryIsoCode { get; set; }
[Required(ErrorMessageResourceType = typeof(Properties.Validation), ErrorMessageResourceName = "DisplayNameIsRequired")]
[TempValidator]
public string DisplayName { get; set; }
}
public class UserMetadata
{
[DisplayName("Username")]
public string Name { get; set; }
}
// Controller action
public ActionResult Update(string id, FormCollection form)
{
var user = UserManager.Find(id);
this.TryUpdateModel<IUser>(user.User, form.ToValueProvider());
this.TryUpdateModel<IPerson>(user.User, form.ToValueProvider());
this.TryUpdateModel<IProvisioningObject>(user.User, form.ToValueProvider());
if (ModelState.IsValid) // always true
{
return Redirect;
}
else
{
return View();
}
}
如果我在UserMetadata添加元数据显示名称,它按预期工作,但似乎对什么非常多余。而这将意味着我也必须复制/粘贴我的所有继承的接口,以便TryUpdateModel行为适当。
我想我在寻找,不需要我去复制和粘贴我的验证属性继承类的方式。
解决方案
新答案:
“我的对象是从WCF服务自动生成的对象。”
自动生成的对象不会对它们的任何属性。你定义在服务器端或客户端上你的对象及其属性?
旧答案: 如果您的元数据是不是IProvisioningObject则没有验证将被调用。该MVC2默认模型绑定只知道如何找到“额外” [MetadataType(buddyClass)验证信息。
有关的更新方案结合对的DTO和然后映射DTO的,如果的IsValid()到主模型类。
其他提示
在您的局部类实现IDataErrorInfo
接口
你将不得不编写自定义验证为每个字段(在这里你可以使用数据标注类验证每个需要的属性)
如果您需要的代码示例然后让我知道。我会写吧!
源: HTTP:// www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-37-cs.aspx
你怎么知道验证不被叫什么名字?你在你更新控制器检查ModelState.IsValid并发现它被错误地回来真的吗?
一个典型的更新模式是:
UpdateModel(model);
if(!ModelState.IsValid) return View(model);
return RedirectToAction("Index");
如果你在你的模型期待一些“IsValid的”自动被调用,这不会发生。数据的注释工作与在控制器基类的ModelState字典幕后。