我正在尝试使用 DataAnnotations 在 asp.NET MVC 2 RC2 中使用 TryUpdateModel 向我的模型添加验证
var user = UserManager.Find(id);
this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());
这会更新模型,但永远不会调用验证。我也尝试使用 TryUpdateModel (这是用户的直接类型),不使用表单值提供程序,直接使用 ProvisioningObject (具有验证元数据),但无济于事。
谷歌搜索示例只为我提供了通过参数绑定来使用 DataAnnotations 的方法
public ActionResult Update(User user)
我不喜欢更新场景。
任何提示和/或解决方案?
编辑 我的对象是从 WCF 服务自动生成的对象。
我制作了部分以便能够添加 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 中添加 DisplayName 的元数据,它会按预期工作,但这似乎非常多余。这意味着我还必须复制/粘贴所有继承的接口,以便 TryUpdateModel 表现得适当。
我想我正在寻找一种不需要我将验证属性复制并粘贴到继承类的方法。