asp.NET MVC 2 DataAnnotations UpdateModel <t>验证</t>

时间:2010-02-08 16:52:05

标签: c# asp.net-mvc data-annotations updatemodel

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

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

3 个答案:

答案 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字典在幕后工作。