5

我正在尝试使用 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 表现得适当。

我想我正在寻找一种不需要我将验证属性复制并粘贴到继承类的方法。

4

3 回答 3

1

新答案:

“我的对象是从 WCF 服务自动生成的对象。”

自动生成的对象不会有任何属性。您是在服务器端还是在客户端定义对象及其属性?

旧答案:如果您的元数据不在 IProvisioningObject 上,则不会调用验证。MVC2 默认模型绑定器只知道如何找到“额外的”[MetadataType(buddyClass)] 验证信息。

对于更新方案,如果 IsValid() 绑定到 DTO,然后将 DTO 映射到您的主模型类。

于 2010-02-08T17:50:35.167 回答
1

在您的部分类中实现IDataErrorInfo接口您必须为每个字段编写自定义验证(您可以使用数据注释类来验证每个必需的属性)

如果您需要代码示例,请告诉我。我给你写!

来源:http ://www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-37-cs.aspx

于 2010-02-12T13:45:00.937 回答
0

你怎么知道验证没有被调用?您是否在更新控制器中检查 ModelState.IsValid 并发现它错误地返回为真?

典型的更新模式是:

UpdateModel(model);
if(!ModelState.IsValid) return View(model);
return RedirectToAction("Index");

如果您希望自动调用模型上的某些“IsValid”,那将不会发生。数据注释在 Controller 基类上使用 ModelState 字典在幕后工作。

于 2010-02-08T19:29:50.567 回答