【问题标题】:ASP.NET MVC 2 Client Side Validation doesn't work as advertised in VS2010ASP.NET MVC 2 客户端验证不像 VS2010 中宣传的那样工作
【发布时间】:2023-03-17 11:46:01
【问题描述】:

在 VS2010 和 ASP.NET MVC 2 中,客户端验证(JQuery 期货或股票期权)似乎不像宣传的那样有效。

我注意到“关闭”已验证元素不会像承诺的那样调用客户端验证。对于必填字段,您必须选择元素,输入内容,然后将其完全删除,以触发所需的验证。这不是我真正想要的,我希望这只是我这边的配置问题。

如何从以前的版本中获得验证效果,从而不需要以前的值(如果可能,无需修改客户端脚本)?

对于那些在这里问的人,我在客户端做了一些示例。

 <div>
    <% Html.EnableClientValidation(); %>
    <% using (Html.BeginForm("Signup", "Home", new { area = "Admin" }, FormMethod.Post, new { id = "create_account_form", action = "#" })) { %>
        <fieldset>
            <div>
                <table>
                     <tr>
                        <td><label for="Email"> Email</label></td>
                        <td><%= Html.TextBoxFor(m => m.Email, new { name = "Email", @class = "textfield" }) %></td>
                        <td colspan="2"><p class="hint"><%= Html.ValidationMessageFor(m => m.Email)%></p></td>
                    </tr>
                    <tr>
                        <td><label for="Company"> Company</label></td>
                        <td><%= Html.TextBoxFor(m => m.Company, new { name = "Company", @class = "textfield" })%></td>
                        <td colspan="2"><p class="hint"><%= Html.ValidationMessageFor(m => m.Company)%></p></td>
                    </tr>
                </table>
            </div>
        </fieldset>
    <% } %>     

【问题讨论】:

  • 我不明白它会如何/为什么会改变。我刚刚从 VS 2008 迁移到 2010,发现客户端验证的工作方式没有任何区别。
  • 这听起来有点奇怪。你能发布一些html吗?
  • @Alastair Pitts 感谢分享,但如果它的工作原理完全相同,我就不需要发布问题了。您会注意到在原始版本中支持“tabbing off”。您的代码在“关闭”时会触发验证吗?
  • 我相信它在关闭时可以正常工作。我明天上班时需要检查一下。
  • 我认为您应该将其发布到 Microsoft 产品反馈中

标签: asp.net-mvc validation


【解决方案1】:

我可以确认它在“关闭”元素时确实有效,但它似乎是特定类型的验证注释的问题。

看来,如果您有[Required] 属性,那么如果您只是通过相应的输入tab,则不会触发验证。

如果您有[RegularExpression],那么当您退出时会触发此操作。

我怀疑验证是由onechangeblur 事件的组合触发的。这可以解释为什么正则表达式能够被验证(因为它已经改变了),但不是必需的测试。

这是我的视图模型:

    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a first name")]
    [StringLength(50, ErrorMessage = "Maximum of 50 characters")]
    public string FirstName { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a last name")]
    [StringLength(50, ErrorMessage = "Maximum of 50 characters")]
    public string LastName { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Please enter a unique email address")]
    [CustomValidation(typeof(User), "ValidateUniqueEmailAddress")]
    [StringLength(255, ErrorMessage = "Maximum of 255 characters")]
    [RegularExpression(EmailRegEx, ErrorMessage = "Invalid email address entered")]
    public string EmailAddress { get; set; }

和 HTML 代码。

<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm())
   {%>
<%: Html.ValidationSummary(true) %>
<fieldset class="colLeft">
    <legend>Required Fields</legend>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.FirstName) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.FirstName) %>
        <%: Html.ValidationMessageFor(model => model.FirstName) %>
    </div>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.LastName) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.LastName) %>
        <%: Html.ValidationMessageFor(model => model.LastName) %>
    </div>
    <div class="editor-label">
        <%: Html.LabelFor(model => model.EmailAddress) %>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.EmailAddress) %>
        <%: Html.ValidationMessageFor(model => model.EmailAddress) %>
    </div>

如您所见,没什么特别的。

在这种情况下,当您浏览所有输入(名字、姓氏、电子邮件地址)时,不会在其中任何一个上触发 [Required] 验证。如果您输入了一个无效的电子邮件地址然后跳出,[RegularExpression] 验证被触发。

这似乎是其中一个验证库的错误/功能。

注意:我在 VS 2010 中对此进行了测试,因为我无法访问 VS 2008,但我看不出这在 2 个版本中会有什么不同,因为它们之间的代码完全相同。我也用过谷歌浏览器。

【讨论】:

  • 阿拉斯泰尔,我认为你是对的。这可能意味着我需要在客户端添加一些 jquery 以获得我想要的行为。当我得到它的工作时,我会为其他人更新一个例子。
  • @Daniel 我遇到了同样的问题。您是否想出了使用 JQuery 的解决方法?
【解决方案2】:

我完全明白你在这里的意思,但实际上这在 VS2010 或 MVC2 中不是问题。

MVC2 使用 jquery.validate 作为验证引擎,它是一个外部 3rd 方库。在这个库中,如果您离开一个必填字段,该字段为空并且自页面加载以来没有在其中输入任何数据 - 它不会立即通知您。但是,如果您有一个“数字”验证器,并且您输入了一个字符串 - 它会立即识别。

好消息是 - 当您单击提交(或仅在 kb 上输入)时,它将尝试提交表单,验证客户端的所有字段,看到一些必填字段尚未填写,并且会显示对他们的验证!所以不会向服务器发送任何请求,这是肯定的!

附注我不是 100% 确定,但我认为它甚至可能不是 jquery.validate 的错。据我记得,blur js 事件只有在您更改字段中的值时才有效,但我在这里可能会严重错误。如果是这样的话 - 这根本不是验证框架或 VS 的错:)

【讨论】:

  • ASP.NET MVC 2.0 默认不使用jQuery.validate,除非你告诉它这样做。 jQuery.validate 支持标签关闭功能。我不太确定默认客户端验证库是否支持这样的功能。
  • 这不是真的。默认情况下,MVC2 不使用 jQuery.validate 进行客户端验证。您可以选择使用包含使用 jQuery.validate 功能的 MVC Futures 库,但现有的 MVC2 客户端验证不使用此功能。
  • 谢谢阿蒂奥姆。虽然其他 cmets 正确的是 jQuery 版本的验证在 Futures 中而不是在股票 MVC2 中,但我在两种风格中都得到了相同的行为。我现在想知道我想要的行为是否是自定义的,以及有关此功能的文献是否不正确。
【解决方案3】:

也许您使用了缩小版本的验证?

就像我的情况一样。在调试模式下,客户端验证有效,但在发布版本中无效。我使用了捆绑文件方法。自动捆绑 - 在发布版本中它包括缩小版本(如果迷你文件在项目中),并且因为文件引用比示例“*.validate.min.js”它不起作用。

但缩小版也不错。

正在解决: 使用对不带“.min”后缀的验证文件的引用。

    bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
    "~/Scripts/jquery.validate.js",
    "~/Scripts/jquery.validate.unobtrusive.js"
    ));

您可以删除未最小化的文件版本,然后最小化版本删除后缀“.min”。 示例:“jquery.validate.min.js”--rename-->“jquery.validate.js”并使用此引用(删除带有“.min”后缀的验证文件)。

【讨论】:

    【解决方案4】:

    你的页面顶部有这个&lt;% Html.EnableClientValidation(); %&gt;吗?

    如果你这样做了,但它仍然不起作用,那么请你发布一些代码。

    编辑

    你加入了吗?

    <script type="text/javascript" src="/scripts/jquery.validate.js"></script>
    <script type="text/javascript" src="/scripts/MicrosoftMvcJQueryValidation.js"></script>
    

    【讨论】:

    • 如果我不进行验证,肯定会调用它。我将用代码更新我的问题。问题在于行为。我必须提交表单才能触发验证,而不是“关闭”元素。
    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多