0

我有这个代码

剃须刀页面:

            <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
      }
    }
  });
};
4

2 回答 2

5

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

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

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

之后,jquery 验证按我的意愿工作。

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

于 2015-11-26T14:43:43.037 回答
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 );
    }
于 2012-09-06T17:47:17.813 回答