我遇到了不显眼的验证问题,因为我有一组控件,并且都有相同的名称。我会很感激任何意见,并会考虑和完全不同的方法
我的控件需要相同的名称,因为它们与模型中的集合绑定,而MVC4使用控件名称(这是有效的)。 不显眼的验证根据名称找到控件,因此它总是找到最后一个。
以下是所有细节:
我的模型中有一系列字符串。
public List<String> Signatures { get; set; }
字符串绑定到视图中的textBoxes集合。 textBoxes的数量基于单选按钮的选择。如果他们选择0则不显示,选择1,显示一个,2,我显示2,最多三个。
我只是在视图中放了3个textBox,并根据所选的单选按钮使用客户端jQuery显示或隐藏。
在视图中,每个文本框都是与模型绑定的html Helper类。这是一个包含两个文本框的示例。 (我在每个下面手动添加验证范围)
@Html.TextBoxFor(m => m.Signatures, new { @class = " firstSigLabel " })
<span class="field-validation-valid" data-valmsg-for="Signatures" data-valmsg-replace="true"></span>
@Html.TextBoxFor(m => m.Signatures, new { @class = " secondSigLabel})
<span class="field-validation-valid" data-valmsg-for="Signatures" data-valmsg-replace="true"></span>
单击save时,action方法会正确地将两个textBox与Signatures集合绑定。
现在我需要添加验证,这取决于我实际显示的textBoxes(单选按钮中的数字)。我希望客户端的工作方式与我让MVC处理它时一样(不显眼的验证)。我们有一个库,它依赖于一些常见的任务(比如显示一个指标)。
当我显示一个文本框时,我使用jQuery添加不显眼的验证所需的属性(并在隐藏它时删除它们)。这样,如果显示它是必需的,如果它是隐藏的,则不需要它。以下是输入后的输入:
<input id="Signatures" class=" firstSigLabel" type="text" value="" name="Signatures" data-val-required="Enter a first Signature Label." data-val="true"></input>
<input id="Signatures" class=" secondSigLabel" type="text" value="" name="Signatures" data-val-required="Enter a second Signature Label." data-val="true"></input>
我还通过不引人注意的验证重新注册来自
$(theForm).removeData('validator');
$.validator.unobtrusive.parse($(theForm));
我的问题是,不显眼的验证使用SPAN中的'data-valmsg-for'属性,通过名称查找元素。但是,我有两个带有该名称的输入,它总是找到最后一个。
我尝试过更改ID(Signatures1,Signatures2),但没有做任何事情。
我无法弄清楚如何更改html助手中的名称,但如果我这样做会破坏控制器中的模型绑定。
我知道这并不简单 - 这是非常突兀的验证。我不知道如何使用注释来实现这一点,因为它取决于客户端的操作。
我假设如果我在三个文本框上使用ValidationMessageFor,绑定到相同的模型属性,我仍然会遇到这个问题。
有没有办法克服这个问题?
我错过了什么吗?
你能想到更好的方法吗?
答案 0 :(得分:2)
不是绑定到集合,而是绑定到集合中的元素。即使集合为空,这也可以工作。这是一个例子:
@Html.TextBoxFor (m => m.Signatures[0], new { @class = "firstSigLabel" })
@Html.TextBoxFor (m => m.Signatures[0], new { @class = "firstSigLabel" })
渲染时,它看起来像这样(我只包括相关的标记):
<input id="Signatures_0_" name="Signatures [0]"></input>
<input id="Signatures_1_" name="Signatures [1]"></input>
现在每个控件都有不同的名称,不显眼的验证应该有效。您可以将集合保留为List数据类型,因为它实现了ICollection。
答案 1 :(得分:0)
如果您将签名集合定义为
ICollection<String> Signatures
然后当您从视图中引用字段时,您应该能够将它们作为签名[0],签名[1]等引用,并且模型绑定器将自动使用
ICollection<T>.Add
确保将它们全部正确映射回集合的方法。