我试图使用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服务自动生成的对象。

我提出的partials能够添加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添加元数据显示名称,它按预期工作,但似乎对什么非常多余。而这将意味着我也必须复制/粘贴我的所有继承的接口,以便TryUpdateModel行为适当。

我想我在寻找,不需要我去复制和粘贴我的验证属性继承类的方式。

有帮助吗?

解决方案

新答案:

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

自动生成的对象不会对它们的任何属性。你定义在服务器端或客户端上你的对象及其属性?

旧答案: 如果您的元数据是不是IProvisioningObject则没有验证将被调用。该MVC2默认模型绑定只知道如何找到“额外” [MetadataType(buddyClass)验证信息。

有关的更新方案结合对的DTO和然后映射DTO的,如果的IsValid()到主模型类。

其他提示

在您的局部类实现IDataErrorInfo接口 你将不得不编写自定义验证为每个字段(在这里你可以使用数据标注类验证每个需要的属性)

如果您需要的代码示例然后让我知道。我会写吧!

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

你怎么知道验证不被叫什么名字?你在你更新控制器检查ModelState.IsValid并发现它被错误地回来真的吗?

一个典型的更新模式是:

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

如果你在你的模型期待一些“IsValid的”自动被调用,这不会发生。数据的注释工作与在控制器基类的ModelState字典幕后。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top