enumdropdownlistfor的jquery验证

时间:2012-09-06 14:07:26

标签: jquery asp.net asp.net-mvc-3 razor jquery-validate

我有这段代码

Razor页面:

            <div class="editor-label">
              @Html.LabelFor(model => model.Citizenship)
            </div>
            <div class="editor-field">
              @Html.EnumDropDownListFor(model => model.Citizenship)
              @Html.ValidationMessageFor(model => model.Citizenship)
            </div>

型号:

[DisplayName("Гражданство")]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Required")]
public CitizenshipEnum? Citizenship { get; set; }

最后我得到了这个HTML:

<select data-val="true" data-val-required="Пожалуйста, укажите значение" id="Citizenship" name="Citizenship"><option value=""></option>
<option value="RF">Российская Федерация</option>
<option value="other">другое государство</option>
</select>

验证有什么问题? unobtrusive.js和其他必需的脚本肯定加载(其他输入验证正常工作)

我正在尝试添加自定义规则

来解决此问题 像这样,但它不起作用:

$(function () {
  $.validator.addMethod('selectNone', function (value, element) { debugger; return $(element).val(); }, "Please select an option");

  $("form").validate({
    rules: {
      '#Citizenship': {
        selectNone: true
      }
    }
  });
};

2 个答案:

答案 0 :(得分:4)

我现在有同样的问题。 如果没有从下拉列表中选择任何项,则枚举值为0,对于jquery验证器,它可能是正确值,因此它会通过验证。

因此,我为枚举类型添加了范围验证属性:

[Range(1, int.MaxValue)]
[EnumDataType(typeof(Priority))]
public Priority Priority { get; set; }

之后,jquery验证工作正常。

注意:通过添加[EnumDataType]属性,如果没有选择任何项目,ModelState在控制器中将无效,因此您可以在控制器中使用它进行验证。

答案 1 :(得分:0)

在控制器中:

    [HttpPost]
    [Authorize]
    public ActionResult Edit ( ClassOfModel model )
    {
        if ( ModelState.IsValid )
        {
            if ( model.Citizenship == null )
            {
                ModelState.AddModelError( "Citizenship", "Пожалуйста, укажите значение" );
            }
            // Do something (e.g. save data)
        }
        return View( model );
    }