繁体   English   中英

asp.NET MVC 2 DataAnnotations UpdateModel <T> 验证

[英]asp.NET MVC 2 DataAnnotations UpdateModel<T> validation

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

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

新答案:

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

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

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

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

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

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

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

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

典型的更新模式是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM