【问题标题】:Correct message for ASP.NET MVC client side ValidationASP.NET MVC 客户端验证的正确消息
【发布时间】:2015-02-01 09:16:44
【问题描述】:

ASP.NET MVC 中,验证用户在文本框中键入的数据非常容易。通过添加以下行,我们要求框架在用户输入错误时显示错误消息。

@Html.ValidationMessageFor(model => model.Surname, "", new { @class = "text-danger" })

在我的应用程序中,我想要这个功能,但我还想在用户输入正确信息时显示一条消息。有没有像ValidationMessageFor 这样的 html 助手,它会显示一条消息,通知用户输入的信息正确

【问题讨论】:

  • 有什么例子可以说明如何自己做吗?
  • 要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于 Stack Overflow 来说是题外话
  • 我建议您浏览jquery-validate-unobtrusive.js 文件以了解添加/删除错误消息的方式和时间,并修改代码以适应。我还建议这样做肯定会惹恼您网站的用户(如果您一直显示烦人的消息告诉我我已经知道是正确的,我不会回来)

标签: c# asp.net asp.net-mvc validation


【解决方案1】:

如果您只有简单的客户端验证案例,您可以尝试更改您的 css不显眼的验证 库将valid class 设置为有效的字段。

所以你可以像这样改变你的CSS:

input.valid, select.valid, textarea.valid{
   border-color: green;
}

需要服务器参与的更复杂的情况,只有在字段更改时发送 AJAX 调用才能实现。

【讨论】:

    【解决方案2】:

    我找到了问题的答案。这不是最好的解决方案,但它有效。我将在这里写它,因为可能会有更多人需要它。

    我创建了一个计时器,每 X 毫秒检查一次模型的所有已验证属性,如果指定属性的错误消息具有类“field-validation-valid”,这意味着用户键入的属性是有效,所以我显示有效的错误消息。否则我隐藏它。

    在视图中,我添加了一个 div,其中包含有效字段的消息,该字段的 id 等于 ValidNameFor,后跟属性名称。

    @Html.ValidationMessageFor(model => model.Surname, "", new { @class = "text-danger" })
    <div id="ValidNameForSurname">This is correct</div>
    

    JavaScript

    $(document).ready(function () {
        setInterval(function ()
        {
            $(".form-control").each(function () {
                var confirmSpan = $("span[data-valmsg-for='" + $(this).attr('id') + "']");
                if (confirmSpan.hasClass("field-validation-valid")) 
                    $("#ValidNameFor" + $(this).attr('id')).show();
                else
                    $("#ValidNameFor" + $(this).attr('id')).hide();
            });
        }, 500);
    });
    

    删除计时器的一种方法是创建一个 jQuery 事件,当一个类被添加或从元素中删除时,它会通知我。如果发生这样的事件,我可以在将“field-validation-valid”类添加到已验证属性时删除计时器并显示或隐藏正确的文本。如果有人知道如何将此类事件添加到元素中,那就太好了。

    【讨论】:

      【解决方案3】:

      您可以使用是否显示验证消息作为显示确认的条件,其中 onfocusout 作为触发器。所以给定一些像这样的html:

      <form id="myFrm" action="/Account/Login?ReturnUrl=%2F" class="form-horizontal" method="post" role="form">            <h4>Use a local account to log in.</h4>
         <hr />
         <div class="form-group">
               <label class="col-md-2 control-label" for="Email">Email</label>
               <div class="col-md-10">
                      <input class="form-control myFrmInputs" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" type="text" value="" />
                      <span class="field-validation-valid text-danger" data-valmsg-for="Email" data-valmsg-replace="true"></span>
                     <span id="confirmEmail" class="confirmationMessage">Correct</span>
               </div>
            </div>
            <div class="form-group">
               <label class="col-md-2 control-label" for="Password">Password</label>
               <div class="col-md-10">
                  <input class="form-control myFrmInputs" data-val="true" data-val-required="The Password field is required." id="Password" name="Password" type="password" />
                  <span class="field-validation-valid text-danger" data-valmsg-for="Password" data-valmsg-replace="true"></span>
                  <span id="confirmPassword" class="confirmationMessage">Correct</span>
               </div>
          </div>
      </form>
      

      像这样的一些 CSS:

      .confirmationMessage {
          display:none;
      }
      

      Javascript/jQuery

        $( document ).ready(function() {
                  $(".myFrmInputs").each(function() {            
                      $(this).focusout(function() {
                         //var errorSpan = $("#myFrm span[data-valmsg-for='" + $(this).attr('id') + "']");
                         var errorSpan = $("#" + $(this).attr('id') + "-error");
                         if (errorSpan.length>0 && !$(errorSpan).is(":visible")) 
                         {
                             $("#confirm" + $(this).attr('id')).show();
                         }
                      });    
                  });
          });
      

      您可以仅根据输入是否未被标记为无效来显示确认。这仅适用于文本输入,但您可以将方法用于其他输入类型。它几乎没有准备好生产,但它可以工作:http://jsfiddle.net/f55xsLjx/1/

      【讨论】:

      • 这会因多种原因而失败。 (1) 不显眼的验证是惰性的,因此当用户通过控件进行选项卡时,即使不正确也会显示“正确”消息 (2) 您称为 confirmSpan 的元素始终可见 - 不显眼的验证添加了另一个 span它里面的元素 - 所以消息永远不会显示 (3) 无法保证在执行此检查时会添加/删除不显眼的验证消息
      • @StephenMuecke (1) 如果懒惰的意思是 nulls/empties 那么你是对的,但我会让操作人员决定他/她想在那里做什么,可能只是预演的另一个条件,(2)认为这是添加-删除类,但不是,它是一个跨度所以编辑的答案,(3)操作需要在调用 用于执行顺序。
      • 不,您对不显眼的验证工作原理的一些基本知识有误解。如果您有一个带有几个string 属性和[Required] 的表单,并且只是通过控件进行选项卡,则不会触发验证,因此您的代码将显示“正确”,尽管事实并非如此。在您实际进行更改之前不会触发验证(这就是我所说的 lazy)。
      • 接下来,当控件失去焦点时触发验证,也就是你的代码也被触发的时候。您的代码很可能会在添加验证消息之前完成(但不能保证),因此您将再次显示“正确”,但也会显示错误消息(有些混乱)。但无论如何,OP并没有真正考虑到这一点。想象一个控件询问您的姓名或地址,而您打错了字。现在您知道自己犯了一个错误,但您会收到一条消息说“正确”:)
      • @StephenMuecke 我知道制表符通过等于“正确”的空字段,所以他可以按照 (1) 放入一个额外的条件。您所说的其余内容:时间我不同意,因为处理程序是同步的并且按照它们附加的顺序运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多