ASP.NET MVC 2客户端验证不像VS2010中所宣传的那样有效

时间:2010-05-12 04:16:57

标签: asp.net-mvc validation

在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 个答案:

答案 0 :(得分:2)

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

如果你有[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,但我无法看到这两个版本中有何不同,因为它们之间的代码完全相同。我还使用了Google Chrome。

答案 1 :(得分:0)

我完全知道你的意思,但它实际上不是VS2010或MVC2中的问题。

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

好处是 - 当你点击提交(或者只是输入kb)时,它会尝试提交表单,验证客户端的所有字段,看到一些必填字段尚未填写,并且显示他们的验证!因此,不会向服务器发送任何请求,这是肯定的!

<德尔> P.S。我不是百分百肯定,但我认为它甚至可能不是jquery.validate的错。据我所知,模糊js事件只有在你改变字段中的值时才有效,但我可能会在这里严重错误。如果是这种情况 - 根本不是验证框架或VS的错误:)

答案 2 :(得分:0)

也许你使用minfied版本的验证?

就像我的情况一样。在调试模式下,客户端验证工作正常,但在发布版本中没有。我使用了bundle文件方法。 Bunndle automaticaly - 在发布版本中它包括缩小版本(如果迷你文件在项目中),并且因为文件引用属于示例&#34; * .validify.min.js&#34;它没有用。

但缩小版本并不坏。

<强>解决: 使用对没有&#34; .min&#34;的validaion文件的引用后缀。

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

您可以删除未最小化的文件版本,然后最小化版本删除后缀&#34; .min&#34;。 例如:&#34; jquery.validate.min.js&#34; --rename - &GT; &#34; jquery.validate.js&#34;并使用此引用(删除带有&#34; .min&#34;后缀的验证文件。)

答案 3 :(得分:-1)

您的页面顶部是否有<% Html.EnableClientValidation(); %>

如果你这样做但它仍然无效,那么请你发一些代码。

编辑

你有没有;

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