我想通过使用“@ Html.ValidationMessageFor”在客户端验证表单。 它正确地为文本框工作。 我在表单中也有一些复选框。 我想用相同的方法来验证,每个组至少有一个复选框被选中。 但是如果我没有弄错的jQuery验证插件使用复选框的名称如果选择至少一个知道的人(例如:http://jqueryvalidation.org/files/demo/radio-checkbox-select-demo.html):至少选中一个复选框 - Asp.Net MVC - jQuery
<html>
<head>
<script src="http://jqueryvalidation.org/files/lib/jquery-1.11.1.js"></script>
<script src="http://jqueryvalidation.org/files/dist/jquery.validate.js"> </script>
<script>
$(document).ready(function() {
$("#form1").validate({
rules:{
spamName: {
required: true,
},
},
messages:{
spamName:{
required: "This is my custom message",
},
}
});
});
</script>
<style>
.block {
display: block;
}
form.cmxform label.error {
display: none;
}
</style>
<title></title>
</head>
<body>
<form class="cmxform" id="form1" method="get" action="">
<fieldset>
<legend>Spam</legend>
<label for="spam_email">
<input type="checkbox" class="checkbox" id="spam_email" value="email" name="spamName" required>Spam via E-Mail
</label>
<label for="spam_phone">
<input type="checkbox" class="checkbox" id="spam_phone" value="phone" name="spamName">Spam via Phone
</label>
<label for="spam_mail">
<input type="checkbox" class="checkbox" id="spam_mail" value="mail" name="spamName">Spam via Mail
</label>
<label for="spamName" class="error">This field is required custom message.</label>
</fieldset>
<p>
<input class="submit" type="submit" value="Submit">
</p>
</form>
</body>
</html>
所以复选框应该有相同的名称组。
这意味着在提交表单后不可能检索哪些值,因为名称用于通过在名称(http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx)中添加索引属性将html表单绑定到模型。
是否有人知道或有解决方案来绕过此问题?
的代码示例是:
public class Mandatory
{
public Mandatory()
{
CheckboxItems = new List<CheckboxItem>();
}
public IList<CheckboxItem> CheckboxItems { get; set; }
}
public class CheckboxItem
{
public bool CheckboxValue { get; set; }
public string Name { get; set; }
}
在视图:
@model WebApplication20.Models.Mandatory
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
@Html.ValidationMessageFor(model => model.CheckboxItems)
@Html.EditorFor(model => model.CheckboxItems)
<input type="submit" value="Submit" id="submit">
}
编辑器模板中使用:
@model WebApplication20.Models.CheckboxItem
<div class="form_row">
@Html.HiddenFor(x => x.Name, Model.Name)
<label for="@Model.CheckboxValue"></label>
<span class="content-checkbox">
@Html.CheckBoxFor(x => x.CheckboxValue)
@Html.LabelFor(x => x.CheckboxValue, Model.Name)
</span>
</div>
最后在HomeController中:
public ActionResult Index()
{
var items = new Mandatory();
items.CheckboxItems.Add(new CheckboxItem
{
CheckboxValue = true,
Name = "test 1",
});
items.CheckboxItems.Add(new CheckboxItem
{
CheckboxValue = false,
Name = "test 2",
});
items.CheckboxItems.Add(new CheckboxItem
{
CheckboxValue = true,
Name = "test 3",
});
return View(items);
}
[HttpPost]
public ActionResult Index(Mandatory test)
{
return RedirectToAction("Index");
}
Thx!
看来,顶部HTML片段是一个测试用例与普通的HTML ,不在'asp.net mvc'中。想知道你是否使用'Microsoft.jQuery.Unobtrusive.Validation'? – 2014-10-28 01:46:53
开箱即可解决此问题。创建服务器端验证就足够简单了,但客户端验证需要创建自己的验证器,该验证器只适用于模型中的一个特定属性。只要处理'submit'事件并取消事件并显示一条消息(并处理所有“复选框”的更改事件以删除该消息)将会容易得多 – 2014-10-28 10:28:16
Venkaka,实际上我正在使用不显眼的验证。这个html代码片段就是为了显示jquery验证仅在复选框具有相同名称时才起作用。如果可以使用不同的复选框名称进行验证,我可以调整asp.net mvc来呈现正确的html。 – prorace 2014-10-28 20:11:37