填充了枚举值的下拉列表的客户端验证

时间:2012-03-23 19:47:52

标签: asp.net-mvc

我有一个视图,我使用带枚举的下拉列表:

public enum MaterialWorthEnumViewModel
{
    [Display(Name = "")] Undefined,
    [Display(Name = "< 1.000€")] LessThan1000,
    [Display(Name = "1.000€ < 10.000€")] Between1000And10000,
    [Display(Name = "10.000€ < 100.000€")] Between10000And100000,
    [Display(Name = "100.000€ < 25.000.000€")] Between100000And25000000,
    [Display(Name = "> 25.000.000€")] GreaterThan250000000,
}

我使用具有此视图的视图模型:

public class MaterialEditNewViewModel
{
    public int RequestID { get; set; }
    ...
    [EnumRequired]
    public MaterialWorthEnumViewModel MaterialWorth { get; set; }
}

如上所示,我使用了自定义验证[EnumRequired]我从在线博客中获取代码。

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class EnumRequiredAttribute : RequiredAttribute    
{
    private const string UNDEFINED_VALUE = "Undefined";
    public string UndefinedValue { get; set; }

    public EnumRequiredAttribute() : this(UNDEFINED_VALUE)        
    {        }

    public EnumRequiredAttribute(string undefinedValue) : base()        
    {
        if (String.IsNullOrWhiteSpace(undefinedValue))            
        {
            throw new ArgumentNullException("undefinedValue");            
        }

        UndefinedValue = undefinedValue;        
    }         

    public override bool IsValid(object value)        
    {            
        if (value == null)            
        {                
            return false;            
        }             

        var undefined = Enum.Parse(value.GetType(), UndefinedValue);             
        return !Enum.Equals(value, undefined);        
    }    
}

以下是客户端验证

public class ModelClientValidationEnumRequiredRule : ModelClientValidationRule 
{
    public ModelClientValidationEnumRequiredRule(string errorMessage, string undefinedValue) 
    { 
        base.ErrorMessage = errorMessage; 
        base.ValidationType = "enumrequired";
        base.ValidationParameters.Add("undefinedvalue", undefinedValue); 
    } 
}

public class EnumRequiredAttributeAdapter : DataAnnotationsModelValidator<EnumRequiredAttribute> 
{ 
    public EnumRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, EnumRequiredAttribute attribute) 
        : base(metadata, context, attribute) 
    { } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
        return new ModelClientValidationEnumRequiredRule[] 
        { 
            new ModelClientValidationEnumRequiredRule(base.ErrorMessage, Attribute.UndefinedValue) 
        }; 
    } 
}

以下是客户端验证的javascript

Sys.Mvc.ValidatorRegistry.validators.enumrequired = function (rule) {
    var undefinedValue = rule.ValidationParameters.undefinedvalue;
    return function (value, context) {
        return value != undefinedValue;
    }
}

我还更新了我的GLobal.asax文件:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EnumRequiredAttribute), typeof(EnumRequiredAttributeAdapter)); 

验证在服务器端运行良好,但永远不会触发客户端验证。因此,当我在我的下拉列表视图中没有选择任何值时,我会在控制器,然后服务器端验证发生,我回到视图。我的结论是客户端验证没有发生。

是否有人可以帮助我为此下拉列表进行有效的客户端验证?

感谢。我有点失落。

1 个答案:

答案 0 :(得分:2)

我认为您的EnumRequiredAttribute和其他两个班级之间没有任何关系。如果您使用的是ASP.NET MVC 3,则需要将自定义验证属性与适配器相关联。这可以在Application_Start

中完成
DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(EnumRequiredAttribute), 
    typeof(EnumRequiredAttributeAdapter)
);

同样在您的客户端,您已经显示了一些依赖于Microsoft*.js库的js代码。这些已经过时,不应再使用了。 ASP.NET MVC 3中用于客户端验证的默认标准是jquery.validate插件。

让我们举一个例子。

型号:

public class MyViewModel
{
    [EnumRequired]
    public MaterialWorthEnumViewModel MaterialWorth { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

查看(Index.cshtml):

@model MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/enumrequiredadapter.js")" type="text/javascript"></script>

@using (Html.BeginForm())
{
    @Html.LabelFor(x => x.MaterialWorth)
    @Html.EditorFor(x => x.MaterialWorth)
    @Html.ValidationMessageFor(x => x.MaterialWorth)
    <button type="submit">OK</button>
}

最后是enumrequiredadapter.js适配器:

(function ($) {
    $.validator.unobtrusive.adapters.add('enumrequired', ['undefinedvalue'], function (options) {
        options.rules['enumrequired'] = options.params;
        if (options.message != null) {
            options.messages['enumrequired'] = options.message;
        }
    });

    $.validator.addMethod('enumrequired', function (value, element, params) {
        return value != params.undefinedvalue;
    });

})(jQuery);

另外,请不要忘记从您的网站中删除所有Microsoft*.js脚本引用的痕迹。这就是它。