我正在尝试使用DataAnnotations在asp.NET MVC 2 RC2中为我的模型添加验证,使用TryUpdateModel
var user = UserManager.Find(id);
this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());
这会更新模型,但永远不会调用验证。我也尝试使用TryUpdateModel(这是用户的直接类型),不使用表单值提供程序,直接使用ProvisioningObject(具有验证元数据),但无济于事。
Google搜索示例仅为我提供了通过参数绑定来使用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表现得恰当。
我想我正在寻找一种方法,不需要我将验证属性复制并粘贴到继承的类中。
答案 0 :(得分:1)
新答案:
“我的对象是来自WCF服务的自动生成的对象。”
自动生成的对象将不具有任何属性。您是在服务器端还是在客户端定义对象及其属性?
旧答案: 如果您的元数据不在IProvisioningObject上,则不会调用任何验证。 MVC2默认模型绑定器只知道如何查找“额外”[MetadataType(buddyClass)]验证信息。
对于更新方案,绑定DTO,然后映射DTO,如果IsValid()到主模型类。
答案 1 :(得分:1)
在您的分部类中实现IDataErrorInfo
接口
您必须为每个字段编写自定义验证(您可以使用数据注释类来验证每个必需的属性)
如果您需要代码示例,请告诉我。我会为你写的!
来源:http://www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-37-cs.aspx
答案 2 :(得分:0)
你怎么知道验证没有被调用?您是否在更新控制器中检查ModelState.IsValid并发现它错误地返回true?
典型的更新模式是:
UpdateModel(model);
if(!ModelState.IsValid) return View(model);
return RedirectToAction("Index");
如果您希望自动调用模型上的某些“IsValid”,则不会发生这种情况。数据注释使用Controller基类上的ModelState字典在幕后工作。