禁用某些字段的验证

时间:2010-03-25 21:32:16

标签: asp.net-mvc validation

我有一个ViewModel用于添加具有属性的用户:Email,Password,ConfirmPassword以及所有属性的Required属性。编辑用户时,我不需要Password和ConfirmPassword属性。

有没有办法在不同的控制器操作中禁用某些属性的验证,还是最好创建一个单独的EditViewModel?

2 个答案:

答案 0 :(得分:3)

我喜欢将其分解并为每个视图创建一个包含所有常见数据和inhierit的基本模型:

class UserBaseModel
{
    int ID { get; set; }

    [Required]
    string Name { get; set; }       

    [Required]
    string Email { get; set; }               
    // etc...
}

class UserNewModel : UserBaseModel
{
    [Required]
    string Password { get; set; }

    [Required]
    string ConfirmPassword { get; set; }
}

class UserEditModel : UserBaseModel
{
    string Password { get; set; }
    string ConfirmPassword { get; set; }
}

有兴趣知道是否有更好的方式,虽然这种方式看起来很干净灵活。

答案 1 :(得分:0)

您可以编写一个可以测试条件的自定义属性,并允许空字段或不允许它。

下面是一个简单的演示,我把这些人放在一起。您需要修改以适合您的目的/

    using System.ComponentModel.DataAnnotations;

    namespace CustomAttributes

    {

    [System.AttributeUsage(System.AttributeTargets.Property)]

    public class MinimumLength : ValidationAttribute

    {
        public int Length { get; set; }
        public MinimumLength()
        {
        }

        public override bool IsValid(object obj)
        {
            string value = (string)obj;
            if (string.IsNullOrEmpty(value)) return false;
            if (value.Length < this.Length)
                return false;
            else
                return true;
        }
    }
}

模型;

using CustomAttributes;

namespace Models
{
    public class Application
    {
        [MinimumLength(Length=20)]
        public string name { get; set; }
    }
}

控制器

 [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(Application b)
{
    ViewData["Message"] = "Welcome to ASP.NET MVC!";

    if (ModelState.IsValid)
    {
        return RedirectToAction("MyOtherAction");
    }
    return View(b);
}

enter code here