【发布时间】:2018-07-12 16:39:24
【问题描述】:
我有一个 Razor 视图,它使用 HTML 帮助程序和其他使用 jQuery DataTable 的下拉菜单,
<div class="form-group">
@Html.LabelFor(model => model.CarTyres, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-2">
@Html.ListBoxFor(model => model.SelectedCarTyres, Model.CarTyres, htmlAttributes: new { @class = "selectpicker form-control", @multiple = "", @data_actions_box = "true" })
@Html.ValidationMessageFor(model => model.SelectedCarTyres, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Drivers, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-2">
@Html.ListBoxFor(model => model.SelectedDrivers, Model.Drivers, htmlAttributes: new { @class = "selectpicker form-control", @multiple = "", @data_actions_box = "true" })
@Html.ValidationMessageFor(model => model.SelectedDrivers, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.CarJacks, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-5">
<table id="filtersTable">
<thead>
<tr>
<th>Select</th>
<th>Name</th>
</tr>
</thead>
</table>
</div>
@Html.ValidationMessageFor(model => model.CarJacksCheckBox, "", new { @class = "text-danger" })
</div>
在我的模型中,我将 required 设置为 true,这样当我检查 Model.IsValid() 时,如果未设置任何这些项目,它将返回 false,并且效果很好。
public class ReportViewModel
{
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
[Required]
public ICollection<int> SelectedCarTyres { get; set; }
public IEnumerable<SelectListItem> CarTyres { get; set; }
[Required]
public ICollection<int> SelectedDrivers { get; set; }
public IEnumerable<SelectListItem> Drivers { get; set; }
public IEnumerable<CarJackViewModel> CarJacks { get; set; }
[Required]
public string SelectedSampleTime { get; set; }
public IEnumerable<SelectListItem> SampleTimes { get; set; }
[Required]
public IEnumerable<int> CarJacksCheckBox { get; set; }
}
为了使 javascrip 数据表成为必需,我复制了复选框上的验证属性,如下所示:
$('#filtersTable').DataTable(
{
"iDisplayLength": 25,
"ajax": {
"url": "/CarJacks/Loaddata",
"type": "GET",
"datatype": "json"
},
"columns": [
{
"data": "IsSelected",
"render": function (data, type, row) {
if (type === 'display') {
return '<input type="checkbox" name="CarJacksCheckBox" class="editor-active" data-val="true" data-val-required="The CarJacks field is required.">';
}
return data;
}
],
"rowCallback": function (row, data) {
//Removed for Brevity
}
}
);
但是,当没有选择 CarJackCheckBox 时,我没有得到任何客户端验证。
虽然 (ModelState.IsValid) 返回 false,$(form).valid() 返回 true,因此客户端没有错误。
我错过了哪一部分?
【问题讨论】:
-
你想要什么验证?您是否要求至少选择一个复选框?
-
@StephenMuecke,是的。正如我设置的那样,[必需] public IEnumerable
CarJacksCheckBox { get;放; } ,至少需要选中一个复选框,否则 Model.IsVaid() 将始终失败.. -
jquery.validate.unobtrusive.js 不提供该功能。您需要编写自己的脚本
-
好的,我看到了几个链接,他们正在检查所选项目的数组,然后验证长度,将遵循这一点。也请让我知道任何好的链接,你可能知道..
-
我依稀记得在一两年前回答过一个类似的问题,但现在还找不到。如果我这样做了会 ping 你,或者稍后添加答案
标签: javascript jquery asp.net-mvc razor unobtrusive-validation