由於我處理的是一個非常複雜的模型和表單,因此我會通過一個更容易理解的示例來減少問題(請原諒是否有任何錯字)。嵌套集合的不顯眼驗證
首先,我將展示場景:
模型...
public class Foo
{
[Required]
public int fooId {get; set;}
public string fooName {get; set;}
public List<Bar> barList {get; set;}
}
public class Bar
{
[Required]
public int barId {get; set;}
public string barName {get; set;}
}
的觀點...
@model Foo
@using (Html.BeginForm("Save", "form", FormMethod.Post))
{
<div class="control-group">
<div class="controls">
@Html.TextBoxFor(model => Model.fooId)
</div>
</div>
<div class="control-group">
<div class="controls">
@Html.TextBoxFor(model => Model.fooName)
</div>
</div>
@for (int i = 0; i < Model.barList.Count(); i++)
{
@Html.EditorFor(m => m.barList[i])
}
}
的 「欄中的」 編輯模板...
@model Bar
<div class="control-group">
<div class="controls">
@Html.TextBoxFor(m => m.barId)
</div>
</div>
<div class="control-group">
<div class="controls">
@Html.TextBoxFor(m => m.barName)
</div>
</div>
這個問題, m在客戶端驗證嵌套集合中的輸入時,在這種情況下,我無法驗證「barId」輸入字段。它只是忽略它... 在fooId字段的情況下,它的確認無誤。
如果深究下去,連2「欄」項「foo」的對象會產生這樣的:
<div class="control-group">
<div class="controls">
<input class="input-validation-error" id="fooId" name="fooId" type="text" value="">
</div>
</div>
<div class="control-group">
<div class="controls">
<input id="fooName" name="fooName" type="text" value="">
</div>
</div>
<div class="control-group">
<div class="controls">
<input id="barList_0__barId" name="barList[0].barId" type="text" value="">
</div>
</div>
<div class="control-group">
<div class="controls">
<input id="barList_0__barName" name="barList[0].barName" type="text" value="">
</div>
</div>
<div class="control-group">
<div class="controls">
<input id="barList_1__barId" name="barList[1].barId" type="text" value="">
</div>
</div>
<div class="control-group">
<div class="controls">
<input id="barList_1__barName" name="barList[1].barName" type="text" value="">
</div>
</div>
正如你所看到的,「酒吧」集合內的項目均獲得了不同ID和名稱。這是渲染集合的正常行爲。
但它似乎是客戶端驗證不適用於這些ID和名稱。只有當我將ID &名稱更改爲「barId」,刪除收集索引時,驗證纔有效。
經過數小時的調查,我發現了一些有關這類問題的文章和帖子,但沒有具體的和我仍然無法解決這個問題。
IValidatableObject in MVC3 - client side validation
mvc clientside validation for nested (collection) properties
您發佈似乎並不符合您的觀點和編輯模板的輸出,不應該前兩個是Foo控件,每個Bar都有Id和Name控件? – christofr
是的,對不起。現在它已更正 – Javier
如果您使用JavaScript添加收藏品,您是否刷新了驗證?例如,'var form = $(「#editItem」);''form.removeData('validator');''form.removeData('unobtrusiveValidation');''。$ .validator.unobtrusive.parse(form); '是我爲集合項添加我的add方法後調用的。 –