【问题标题】:Client side validation is not firing for RequiredIf客户端验证未触发RequiredIf
【发布时间】:2014-12-18 06:02:07
【问题描述】:

我正在使用JaroslawWaliszkoExpressiveAnnotations。当我通过ModelState.IsValid 检查服务器端时,它工作正常。但它没有显示客户端验证消息。我不知道缺少什么。我也添加了 jquery 文件。这是我申请RequiredIf的房产:

// When Role = Assistant Professor(which has id = 3), 
// His/ Her head's Id should be selected as ParentID.

[RequiredIf("RoleID == 3", ErrorMessage = "Select Head.")] 
public Nullable<int> ParentID { get; set; }

呈现的 HTML 如下:

<select class="form-control ng-pristine ng-valid" 
        data-val="true" 
        data-val-number="The field ParentID must be a number." 
        data-val-requiredif="Select Head." 
        data-val-requiredif-allowempty="false" 
        data-val-requiredif-constsmap="{}" 
        data-val-requiredif-expression="RoleID == 3" 
        data-val-requiredif-fieldsmap="{"RoleID":"numeric"}" 
        id="ParentID" 
        name="ParentID" 
        ng-model="DTO.ParentID" 
        ng-options="obj.Value as obj.Text for obj in headList">

    <option selected="selected" value="" class="">--select--</option>
    <option value="0">Mr. Kevin Thomas</option>
    <option value="1">Ms. Lisa Brown</option>
    <option value="2">Mr. Sail Kapoor</option>
</select>

我已经实现的东西:

  1. 安装包:Install-Package ExpressiveAnnotations,
  2. Global.asax

    中添加了以下代码
    DataAnnotationsModelValidatorProvider.RegisterAdapter(
        typeof (RequiredIfAttribute), typeof (RequiredIfValidator));
    DataAnnotationsModelValidatorProvider.RegisterAdapter(
        typeof (AssertThatAttribute), typeof (AssertThatValidator));
    
  3. jquery 验证文件下方的 bundle 中添加了 expressive.annotations.validate.js,并在指定页面添加了 bundle。

【问题讨论】:

  • 您的@HtmlValidationMessageFor(m =&gt; m.ParentID) 被收录了吗?第一个选项看起来也有问题 - 您是手动创建的吗?
  • @StephenMuecke 是的,我有。
  • 有什么理由不使用@Html.DropDownListFor(m =&gt; m.ParentID)
  • @StephenMuecke 它将有治疗员工的名单。如果您正在注册较低级别的新员工,则必须从该选项中选择。
  • 抱歉,不明白 - 这与不使用 html 帮助器有什么关系?

标签: c# jquery asp.net-mvc data-annotations


【解决方案1】:

在我看来还不错。控制台输出是否有任何错误?

你可以试试这个对我有用的:

public class Model
{
    public IEnumerable<SelectListItem> Supervisors
    {
        get
        {
            return new[]
            {
                new SelectListItem {Text = "Mr. Kevin Thomas", Value = "0"},
                new SelectListItem {Text = "Ms. Lisa Brown", Value = "1"},
                new SelectListItem {Text = "Mr. Sail Kapoor", Value = "2"}
            };
        }
    }

    [RequiredIf("RoleID == 3", ErrorMessage = "Select Head.")]
    public int? ParentID { get; set; }
    ...

并查看:

@Html.DropDownListFor(model => model.ParentID, Model.Supervisors, "--select--")
@Html.ValidationMessageFor(model => model.ParentID)

另外,除非您已经看过,否则请查看sample project,在那里您可以找到一些类似的案例。

更新:

Look here for few troubleshooting steps.

【讨论】:

  • 正确的方法是删除第一个SelectListItem并使用@Html.DropDownListFor(m =&gt; m.ParentID, Model.Supervisors, "--select--")Model.Supervisors已经是一个选择列表时没有必要再创建一个选择列表,并且最后一个参数正确呈现一个'null'标签选项 - &lt;option value&gt;--select--&lt;/option&gt;
  • @Stephen Muecke:谢谢,我完全同意 - 调整答案以反映您的建议。
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 2011-05-27
  • 2014-06-15
  • 2013-11-23
  • 2011-06-23
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多