【问题标题】:ASP.NET MVC Complex Model ValidationASP.NET MVC 复杂模型验证
【发布时间】:2010-10-27 18:07:04
【问题描述】:

我有一个复杂的模型

public class ComplexModel
{

    public UserModel userModel;

    public ExtraInfoModel extraModel;
}

在哪里

UserModel 可能有必填字段

如:

public class UserModel
{

     [Required]
     public string email;
}

如何验证 ComplexModel 以确保在 ComplexModel 验证中考虑到其成员模型上的数据注释?

谢谢。

更新:

这是我的确切情况。当我在 ManageProfileModel 的控制器操作中调用 ModelState.IsValid 时,无论是否设置了 GeneralInfoModel 的 ListModelRequired 成员的“SelectedValue”,模型状态是否有效。

public class ManageProfileModel
{
    [Required(ErrorMessage="Experience is required")]
    public int LevelOfExperienceTypeID { get; set; }
    public GeneralInfoModel GeneralInfoModel { get; set; }
}

public class GeneralInfoModel
{
    [Required]
    [DisplayName("Profile Headline")]
    public string ProfileName { get; set; }

    [DisplayName("Signature")]
    public string Signature { get; set; }

    [Required]
    public ListModelRequired LevelOfExperience { get; set; }
}

public class ListModel
{
    public ListModel()
    {
    }

    public ListModel(string name)
    {
        this.Name = name;
    }

    public ListModel(string name, string selectedValue):this(name)
    {
        this.SelectedValue = selectedValue;
    }

    public ListModel(string name, IEnumerable<SelectListItem> members):this(name)
    {
        this.Members = members;
    }

    public ListModel(string name, IEnumerable<SelectListItem> members, string selectedValue)
        : this(name, members)
    {
        this.SelectedValue = selectedValue;
    }

    public IEnumerable<SelectListItem> Members { get; set; }

    public string Name { get; set; }

    public virtual string SelectedValue { get; set; }

    public string Label { get; set; }
}

public class ListModelRequired : ListModel
{
    [Required]
    public override string SelectedValue { get; set; }

    public ListModelRequired():base()
    {
    }

    public ListModelRequired(string name):base(name)
    {
    }

    public ListModelRequired(string name, string selectedValue):base(name,selectedValue)
    {
    }

    public ListModelRequired(string name, IEnumerable<SelectListItem> members)
        : base(name, members)
    {
    }

    public ListModelRequired(string name, IEnumerable<SelectListItem> members, string selectedValue)
        : base(name, members,selectedValue)
    {
    }
}

【问题讨论】:

    标签: c# asp.net-mvc validation model


    【解决方案1】:

    我认为默认模型绑定器是正确的,它会验证使用数据注释的子模型。您实际上遇到了什么问题?例如,我有类似的东西:

    public class OnlineDonationModel
    {
         [Required]
         public decimal? Amount { get; set; }
    
         public ContactModel Contact { get; set; }
    }
    
    public class ContactModel
    {
         [Required]
         public string FirstName { get; set; }
    
         [Required]
         public string LastName { get; set; }
    
         [Required]
         public string Address { get; set; }
    
         ...
    }
    

    【讨论】:

    • 我刚刚发布了我的问题的更新。看起来 DefaultModelBinder 在我的情况下不起作用。非常感谢任何见解。
    • 我看到的唯一区别是您正在制作所需的实际子模型实例。我认为如果您在子模型上有所需的属性,这些属性仍然会冒泡,所以您不需要它。尝试删除子模型实例上的 required 属性,看看它是否改变。
    • 这也是我的想法。但事实并非如此。所以,为了寻找解决方案,我尝试在顶级模型的成员上添加 [Required]。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多