代码之家  ›  专栏  ›  技术社区  ›  Daniel Crenna

ASP.NET MVC 2客户端验证无法按VS2010中的公告工作

  •  1
  • Daniel Crenna  · 技术社区  · 14 年前

    在VS2010和ASP.NET MVC 2中,客户端验证(jquery futures或股票期权)似乎不像广告中那样有效。

    我注意到一个经过验证的元素“tabbing off”不会像承诺的那样调用客户端验证。对于一个必需的字段,您必须在元素中制表,输入一些内容,然后完全删除它,以便触发所需的验证。这不是我想要的,我希望这只是我这边的配置问题。

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

    对于那些在这里询问的人来说,这是我在客户机端所做工作的一个样本。

     <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>
        <% } %>     
    

    4 回复  |  直到 14 年前
        1
  •  2
  •   Alastair Pitts    14 年前

    我可以确认,当“tabbing off”一个元素时,它确实起作用,但它似乎与特定类型的验证注释有关。

    如果你有 [Required] 属性,则不会触发验证 tab 通过相应的输入。

    如果你有 [RegularExpression] 然后当您退出时触发。

    我怀疑验证是由 onechange blur 事件。这可以解释为什么正则表达式能够被验证(因为它已经改变了),但不能进行所需的测试。

    这是我的视图模型:

        [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>
    

    如你所见,没什么好奇心。

    在这种情况下,当您通过所有输入(名字、姓氏、电子邮件地址)进行制表时,然后 [必需的] 其中任何一个都不会触发验证。如果您输入了无效的电子邮件地址,那么请退出选项卡, [正则表达式] 验证被触发。

    这似乎是一个验证库的错误/特性。

    注意:我在Vs2010中测试过这个,因为我没有访问Vs2008的权限,但是我看不出这在两个版本中有什么不同,因为它们之间的代码完全相同。我还使用了谷歌Chrome。

        2
  •  0
  •   Artiom Chilaru    14 年前

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

    MVC2使用jquery.validate作为验证引擎,它是外部第三方库。在这个库中,如果您从一个字段(该字段是必需的、为空的,并且自页面加载后没有任何数据输入)制表,它不会立即通知您。不过,如果您有一个“数字”验证器,并且您输入了一个字符串,它将立即识别。

    好事情是-当您单击提交(或只在KB上输入)时,它将尝试提交表单,验证客户端上的所有teh字段,查看某些必需字段尚未填充,并将显示对它们的验证!所以不会向服务器发送请求,这是肯定的!

    另外,我不是100%确定,但我认为这可能不是jquery.validate的错误。据我所知,BlurJS事件仅在您更改字段中的值时才起作用,但在这里我可能会大错特错。如果是这样的话——这根本不是验证框架或VS的错:)

        3
  •  0
  •   Drasius    12 年前

    也许你使用验证的最小版本?

    就像我的情况。在调试模式下,客户端验证工作正常,但在发布版本中不工作。我使用了bundle files方法。bundle automatically-在发布版本中,它包括小型版本(如果迷你文件在项目中),并且becouse文件引用了示例“*.validate.min.js”中的不同之处,它不起作用。

    但缩小版也不错。

    解析: 使用对没有“.min”后缀的validion文件的引用。

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

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

        4
  •  -1
  •   griegs    14 年前

    有这个吗 <% Html.EnableClientValidation(); %> 在页面顶部?

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

    编辑

    是否包括在内;

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