MVC3:通过 jQuery 验证是否需要复选框?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4934032/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
MVC3: make checkbox required via jQuery validate?
提问by shannon
I want my "Agree To Terms" checkbox to be mandatory using jQuery validate, in an MVC3 project. I currently get server/client DRY/SPOT validation from "MS data annotation attributes" + "MS MVC3 unobtrusive jQuery validation".
我希望我的“同意条款”复选框在 MVC3 项目中使用 jQuery 验证是强制性的。我目前从“MS 数据注释属性”+“MS MVC3 不显眼的 jQuery 验证”获得服务器/客户端 DRY/SPOT 验证。
Here's a stand-alone test (plain HTML generated by MVC3). Why doesn't it work, please? When run, validation ensures the "Contact Name" field is filled, but doesn't care about the state of the checkbox.
这是一个独立的测试(由 MVC3 生成的纯 HTML)。请问为什么不行?运行时,验证确保填充“联系人姓名”字段,但不关心复选框的状态。
<!DOCTYPE html>
<html>
<head>
<title>RequiredCheckbox</title>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript" src="//ajax.microsoft.com/ajax/jQuery.Validate/1.7/jQuery.Validate.js"></script>
<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.js"></script>
<script type="text/javascript" language="javascript">
$(function () {
// http://itmeze.com/2010/12/checkbox-has-to-be-checked-with-unobtrusive-jquery-validation-and-asp-net-mvc-3/
$.validator.unobtrusive.adapters.add("mandatory", function (options) {
options.rules["required"] = true;
if (options.message) {
options.messages["required"] = options.message;
}
}
});
$.validator.unobtrusive.parse(document);
});
</script>
</head>
<body>
<div>
<form>
<input data-val="true" data-val-mandatory="The field Terms Are Accepted is invalid." id="isTermsAccepted" name="isTermsAccepted" type="checkbox" value="true" />
<input name="isTermsAccepted" type="hidden" value="false" />
<span class="field-validation-valid" data-valmsg-for="isTermsAccepted" data-valmsg-replace="true"></span>
<input data-val="true" data-val-required="The Contact Name field is required." id="contactName" name="contactName" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="contactName" data-valmsg-replace="true"></span>
<button type="submit">Submit</button>
</form>
</div>
</body>
</html>
The rest of this post is just my research notes.
这篇文章的其余部分只是我的研究笔记。
Setting data annotation attribute [required] doesn't help:
http://forums.89.biz/forums/MVC+3+Unobtrusive+validation+does+not+work+with+checkboxes+(jquery+validation)+and+the+fix+for+it.
设置数据注释属性 [required] 没有帮助:
http: //forums.89.biz/forums/MVC+3+Unobtrusive+validation+does+not+work+with+checkboxes+(jquery+validation)+and+the +修复+为+它。
That's fine. What "required" means for a checkbox is obviously a holy war I don't want to wade into, where MS thought they knew better than the jquery team. Coercing it locally should be a simple matter of:$("form").validate({ rules: { cbAgreeToTerms: "required" } });
没关系。复选框的“必需”意味着显然是一场我不想涉足的圣战,MS 认为他们比 jquery 团队更了解。在本地强制它应该是一个简单的问题:$("form").validate({ rules: { cbAgreeToTerms: "required" } });
...right? no, because of:
http://blog.waynebrantley.com/2011/01/mvc3-breaks-any-manual-use-of-jquery.html
http://pinoytech.org/question/4824071/microsofts-jquery-validate-unobtrusive-makes-other-validators-skip-validation
...对?不,因为:
http: //blog.waynebrantley.com/2011/01/mvc3-breaks-any-manual-use-of-jquery.html
http://pinoytech.org/question/4824071/microsofts-jquery-验证不显眼的使其他验证器跳过验证
WHAT? That's pretty stinking cheezy! (IMHO, of course.)
什么?真是太臭臭臭了!(恕我直言,当然。)
Now, I've tried this solution:
http://itmeze.com/2010/12/checkbox-has-to-be-checked-with-unobtrusive-jquery-validation-and-asp-net-mvc-3/
and it didn't work for me. This author's dangling comments and somewhat cargo-cult use of the inverted CHECKBOX test from earlier in his/her article make me wonder if it actually works for him/her, then what other voodoo was involved?
现在,我已经尝试过这个解决方案:
http: //itmeze.com/2010/12/checkbox-has-to-be-checked-with-unobtrusive-jquery-validation-and-asp-net-mvc-3/
和它对我不起作用。这位作者悬而未决的评论和他/她文章前面对倒置 CHECKBOX 测试的一些货物崇拜使我想知道它是否真的适用于他/她,那么还涉及其他什么巫术?
Note I think that the last snippet of JS is equivalent to the cleaner:$.validator.unobtrusive.adapters.addBool("brequired", "required");
That was suggested by the last post in:
http://forums.asp.net/p/1648319/4281140.aspx#4281140
But notice that author comments that he hadn't debugged it yet. It didn't work for me, and reading between the lines, I think he means it didn't work for him?
请注意,我认为 JS 的最后一个片段相当于清洁器:$.validator.unobtrusive.adapters.addBool("brequired", "required");
这是最后
一篇文章所建议的:
http: //forums.asp.net/p/1648319/4281140.aspx#4281140
但请注意,作者评论说他还没调试呢。它对我不起作用,字里行间,我认为他的意思是它对他不起作用?
The unobtrusive.js calls parse on docready, so I tried calling that, but it didn't help me.$.validator.unobtrusive.parse(document);
I've also found a few similar articles and none talk about requiring initialization of any sort. Maybe they are all locally editing the original/public unobtrusive.js? I'd rather not if I can help it, isn't that what the adapters are for?
unobtrusive.js 在 docready 上调用 parse,所以我尝试调用它,但它没有帮助我。$.validator.unobtrusive.parse(document);
我还发现了一些类似的文章,但都没有谈到需要任何类型的初始化。也许他们都在本地编辑原始/公开的 unobtrusive.js?如果我能帮上忙,我宁愿不要,这不是适配器的用途吗?
I found stack-overflow articles, much the same, as well as more complex examples:
ASP .Net MVC 3 unobtrusive custom client validation
Perform client side validation for custom attribute
http://xhalent.wordpress.com/2011/01/27/custom-unobstrusive-jquery-validation-in-asp-net-mvc-3/
But I don't see anything there that is different than what I've already tried.
我发现堆栈溢出文章,大体相同,以及更复杂的例子:
ASP .Net MVC 3 unobtrusive custom client validation
Perform client side validation for custom attribute
http://xhalent.wordpress.com/2011/01/27/ custom-unobtrusive-jquery-validation-in-asp-net-mvc-3/
但我没有看到任何与我已经尝试过的不同的东西。
Is this really working for people? Why can't I get it to work for me?
这真的对人有用吗?为什么我不能让它为我工作?
采纳答案by Paul Hiles
Just change your javascript to this:
只需将您的 javascript 更改为:
(function ($) {
// http://itmeze.com/2010/12/checkbox-has-to-be-checked-with-unobtrusive-jquery-validation-and-asp-net-mvc-3/
$.validator.unobtrusive.adapters.add("mandatory", function (options) {
options.rules["required"] = true;
if (options.message) {
options.messages["required"] = options.message;
}
});
} (jQuery));
You do not actually need to write your own adapter though and can just use:
您实际上并不需要编写自己的适配器,只需使用:
(function ($) {
$.validator.unobtrusive.adapters.addBool("mandatory", "required");
} (jQuery));
回答by shannon
I've summarized here the correctly-working source code, which resulted from applying the accepted answer. Hope you find it useful.
我在这里总结了正确工作的源代码,这是通过应用接受的答案产生的。希望你觉得它有用。
RequiredCheckbox.aspx
必填复选框.aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<RegistrationViewModel>" %>
<!DOCTYPE html>
<html>
<head runat="server">
<title>RequiredCheckbox</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
<script src="//ajax.microsoft.com/ajax/jQuery.Validate/1.7/jQuery.Validate.js" type="text/javascript"></script>
<script src="//ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.js" type="text/javascript"></script>
<script type="text/javascript" language="javascript">
$.validator.unobtrusive.adapters.addBool("mandatory", "required");
</script>
</head>
<body>
<div>
<%
// These directives can occur in web.config instead
Html.EnableUnobtrusiveJavaScript();
Html.EnableClientValidation();
using (Html.BeginForm())
{ %>
<%: Html.CheckBoxFor(model => model.IsTermsAccepted)%>
<%: Html.ValidationMessageFor(model => model.IsTermsAccepted)%>
<%: Html.TextBoxFor(model => model.ContactName)%>
<%: Html.ValidationMessageFor(model => model.ContactName)%>
<button type="submit">Submit</button>
<% } %>
</div>
</body>
</html>
RegistrationViewModel.cs
注册视图模型.cs
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
public class RegistrationViewModel {
[Mandatory (ErrorMessage="You must agree to the Terms to register.")]
[DisplayName("Terms Accepted")]
public bool isTermsAccepted { get; set; }
[Required]
[DisplayName("Contact Name")]
public string contactName { get; set; }
}
MandatoryAttribute.cs
强制属性.cs
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
public class MandatoryAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
return (!(value is bool) || (bool)value);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
ModelClientValidationRule rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationType = "mandatory";
yield return rule;
}
}
回答by vikram
<asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
<h2>
Save New Contact</h2>
<%using (Html.BeginForm("SaveContact", "Contact", FormMethod.Post, new { id = "UserImportTypeForm", @autocomplete = "off" })) %>
<%{ %>
<table style="height: 100px;">
<tr>
<td>
Import Type :
</td>
</tr>
<tr>
<td>
Is Verified
</td>
<td>
<%-- <%=Html.TextBox("UserContactModel.IsVerified", new SelectList(Model.IsVerified, "IsVerified"), new { })%>>--%>
<%-- <input type="text" name="txtIsVerified" id="txtIsVerified" />--%>
<%-- <%= Html.TextBox("txtIsVerified")%>--%>
<%=Html.CheckBox("SelectedUserContact.IsVerified", Convert.ToBoolean(Model.SelectedUserContact.IsVerified) )%>
<%=Html.ValidationSummary("txtIsVerified", "*")%>
</td>
</tr>
<tr>
<td>
First Name
</td>
<td>
<%--<input type="text" name="txtFirstName" id="txtFirstName" />--%>
<%=Html.TextBox ("SelectedUserContact.FirstName", Model.SelectedUserContact.FirstName )%>
<%-- <%=Html.ValidationSummary("FirstName", "*")%>--%>
</td>
</tr>
<tr>
<td>
Last Name
</td>
<td>
<%--<input type="text" name="txtLastName" id="txtLastName" />--%>
<%=Html.TextBox("SelectedUserContact.LastName", Model.SelectedUserContact.LastName)%>
<%=Html.ValidationSummary("LastName", "*")%>
</td>
</tr>
<tr>
<td>
Contact ID
</td>
<td>
<%=Html.TextBox("SelectedUserContact.ContactID",Model.SelectedUserContact.ContactID) %>
<%=Html.ValidationSummary("ContactID","*") %>
</td>
</tr>
<tr>
<td align="right">
<input type="submit" value="Save" name="btnSave" id="btnSave" />
</td>
<td>
<input type="button" value="Cancel" name="btnCancel" id="btnCancel" />
</td>
</tr>
</table>
<%} %>
<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
$("#UserImportTypeForm").validate({
rules:
{
"SelectedUserContact.FirstName": { required: true },
"SelectedUserContact.LastName": { required: true },
"SelectedUserContact.ContactID": {required:true}
},
messages:
{
"SelectedUserContact.FirstName": { required: "*" },
"SelectedUserContact.LastName": { required: "*" },
"SelectedUserContact.ContactID": { required: "*" },
}
});
</script>
</asp:Content>