【发布时间】:2015-09-07 17:08:58
【问题描述】:
我有一个 razor mvc 5 视图,我想在其中验证一些值。
模型
public partial class PersonViewModel
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
}
观点
@using (Html.BeginForm("Process", "SomeController", FormMethod.Post, new { id = "processForm", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<!-- Buttons -->
<div class="row btn-row">
<div class="col-md-12">
<div class="pull-right">
<button class="btn btn-success"><span class="glyphicon glyphicon-floppy-save"></span> Save</button>
</div>
</div>
</div>
<!-- some more html -->
for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>
@Html.CheckBoxFor(m => m[i].ToBeProcessed, new {@id = "[" + i + "[.ToBeProcessed"})
</td>
<td>
@Html.TextBoxFor(m => m[i].FirstName, new {@id = "[" + i + "].FirstName"})
@Html.ValidationMessageFor(m => m[i].FirstName, "Please enter a value", new {@class = "text-danger"})
</td>
<td>
@Html.TextBoxFor(m => m[i].LastName, new {@id = "[" + i + "].LastName"})
@Html.ValidationMessageFor(m => m[i].LastName, "Please enter a value", new {@class = "text-danger"})
</td>
</tr>
}
<!-- some more html -->
} <!-- form close -->
我只想验证复选框 [i].ToBeProcessed 被选中的行。其他行中的文本框应被忽略。
在我的 jQuery 中,我有以下代码:
@section Scripts {
@Script.Render("~/bundles/jqueryval")
<script type="text/javascript">
$(function(){
$("#processForm").validate({
rules: {"[0].FirstName": {required: "[0].ToBeProcessed:checked"},
{"[1].FirstName": {required: "[1].ToBeProcessed:checked"},
{"[0].LastName": {required: "[0].ToBeProcessed:checked"},
{"[1].LastName": {required: "[1].ToBeProcessed:checked"} // note that this is only fixed for testing purposes
});
});
</script>
}
现在,在运行代码时,选中第一个复选框并点击提交按钮,所有文本字段都会被验证,而不仅仅是第一行中的那些。
【问题讨论】:
-
你的模型看起来怎么样?
-
@Dandy 我已经添加了模型。
-
检查Conditional Validation using DataAnnotation,特别是
RequiredIfAttribute。它还具有客户端验证。 -
使用 foolproof
[RequiredIfTrue("ToBeProcessed")]或类似的属性应用于您的FirstName和LastName属性 - 您可以获得客户端和服务器端验证 -
@StephenMuecke 万无一失是适合我的解决方案。我已经为面临相同问题的任何人提供了答案
标签: jquery asp.net-mvc validation