在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>
<% } %>
答案 0 :(得分:2)
我可以确认它在“标记”元素时确实有效,但它似乎是特定类型的验证注释的问题。
如果你有[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>
正如你所看到的,没什么特别的。
在这种情况下,当您选中所有输入(名字,姓氏,电子邮件地址)时,不会触发[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>