【发布时间】:2012-10-19 14:03:04
【问题描述】:
我正在开发一个 ASP MVC3 项目,使用验证和不显眼的 jquery。我在页面上有几个区域需要为其创建自定义验证,并确保它不会破坏其他任何内容。目前我有几个部分,每个部分都有一个单选按钮对、一些文本框、一个按钮和一个表格。用户填写文本框,点击按钮,我有一个函数可以将文本框中的数据放入表格的新行中。我还有一个计数器,每次按下按钮都会前进一次。
验证需要遵循“如果单选按钮返回 true,则计数器需要 > 1。
我编写的这个函数似乎可以工作,但我认为我需要重新编写它,以便将其绑定到现有的验证中,因此需要添加一个方法或规则:
$(document).ready(function () {
$("#nextBtn").click(function () {
var rows = $("#ROTable tr").length;
if ($("#RO_Yes").is("checked") && (rows < 3))
{
$(this).closest("div.historyCollection").css("backgroundcolor: #ff0000;");
}
});
});
我环顾四周,发现 JQUery 网站上有一个部分讨论了规则(从属值),似乎它可能适合。但是因为我对这些东西还很陌生,所以我想在我朝一个方向看太难之前对专家进行调查。感谢您的阅读。
编辑:我一直在玩,我想出了这个:
第二次编辑:正如 TallMaris 所指出的,ROCounter 选择器是错误的,因此现在已更正但仍然失败并出现相同的错误:
$(document).ready(function () {
$("#ROCounter").rules("add", {
required: ($("#RO-Yes").is(":checked")) && ($('#ROCounter') < 1),
messages: {
required: "Please enter further information"
}
});
});
但它破坏了所有验证并导致 jquery.validate.min.js 文件出错: " TypeError: 无法读取未定义的属性 'form'"。
ROCounter 是一个隐藏字段。如果错误消息附加到此隐藏字段,是否意味着该消息也将被隐藏,所以不显示?这是一些 HTML:
<div class="formQuestion">
<div class="editor-field2">
@Html.RadioButtonFor(m => m.HistoryModel.EverHadRestrainingOrder, true, new { @class = "commentBox", id="RO_Yes" })
<label for="HistoryModel_ChildAbuseCurrent">Yes</label>
@Html.RadioButtonFor(m => m.HistoryModel.EverHadRestrainingOrder, false, new { @class = "commentBox", id = "RO_No", @checked = "checked" })
<label for="HistoryModel_ChildAbuseCurrent">No</label>
</div>
<div class="editor-label2">
@Html.LabelFor(m => m.HistoryModel.EverHadRestrainingOrder)
</div>
@* Start Fieldset collection for Restraining Order *@
<div class="hidden">
<fieldset class="historyCollection">
<legend>Please provide the following information</legend>
<div class="formGroupHist">
<div class="editor-label-Hist">
@Html.Label("Date of Order")
</div>
<div class="editor-field-Hist">
@Html.TextBox("OrderDate-RO", null, new { @class = "dp" })
</div>
</div>
<div class="formGroupHist" style="width: 125px">
<div class="editor-label-Hist">
@Html.Label("State")
</div>
<div class="editor-field-Hist">
@Html.DropDownList("State-RO", new SelectList(Model.State, "Value", "Text"), "Select", new { style = "width: 65px;" })
</div>
</div>
<div class="formGroupHist">
<div class="editor-label-Hist">
@Html.Label("Name of Protected Party")
</div>
<div class="editor-field-Hist">
@Html.TextBox("ProtectedParties")
</div>
</div>
<div class="formGroupHist">
<div class="editor-label-Hist">
@Html.Label("Explanation of Circumstances")
</div>
<div class="editor-field-Hist">
@Html.TextArea("Comments-RO")
</div>
</div>
<div class="button">
<button type="button" id="ROButton" class="SKButton">Add Information</button>
</div>
<div>
@Html.HiddenFor(m => m.ROCounter)
</div>
<table id="ROTable" class="data-table-page2">
<tr>
<th>Date of Order</th>
<th>State</th>
<th>Name(s) of Protected Parties</th>
<th>Explanation of Circumstances</th>
</tr>
<tr class="ROTempRow">
<td colspan=4>No Information Entered.</td>
</tr>
</table>
</fieldset>
</div>
不过,我的主要问题是如何正确地将新的验证规则与现有的验证联系起来。我已经读过,不显眼的首先解析文档以寻找现有的验证,如果找到任何验证,它将不再进行。大部分表单都与“库存”验证相关联,因此我不能将其损坏。一旦我弄清楚了那部分,我可能会弄清楚它的实际规则编码。
谢谢。
【问题讨论】:
-
可能只是因为选择器错误...试试
$('#ROCounter')。这个 ROCounter 到底是什么类型的?你能展示一些 HTML 吗? -
这里胡乱猜测一下,模型上的 ROCounter 属性的注解是什么?请记住,即使您什么都不放,仅仅通过(例如)一个 int,将在不显眼的验证中生成至少一个“必需”规则,然后您将在 javascript 中重新添加...
-
@TallMaris - 啊,很好。尽管模型中没有装饰该属性,但我检查了呈现的 HTML,并且如您所说,对其进行了验证。我已经将该值设置为 0,这就是为什么它从未作为验证错误出现的原因。因此,如果已经附加了 data-val 属性,我可以根据需要使用/添加更多属性来实现我的验证。所以现在我只需要知道我是否应该添加一个不显眼的方法,或者一个验证插件规则。你的想法?
-
这真的取决于所需的逻辑。 “必需”规则意味着该值不能为空,如果您需要更复杂的规则,您可以创建它(
$.validator.addMethod...)并将其添加到您的字段中。如果“必需”规则是您需要的,但您希望它使其“自定义”(实际上,仅在某些情况下计算并且意味着您可以接受空值),请将 C# 属性从int更改为 @987654327 @ 并且 MVC 不会为您创建所需的规则。
标签: jquery validation jquery-validate