[英]How can I do validation on multiple objects simultaneously and add it to partial views
我正在為其中包含子實體列表的父實體開發表單。
在Parent.cshtml中,我使用前景色在子視圖中渲染子級:
@foreach (var child in Model.Children)
{
Html.RenderPartial("_Child", child);
}
在_Child.cshtml中,我使用以下代碼:
@using (Html.BeginCollectionItem("Children"))
{
@Html.EditorFor(model => Model.ValidatedProperty, new {htmlAttributes = new {@class = "form-control"}})
@Html.ValidationMessageFor(model => Model.ValidatedProperty, "", new {@class = "text-danger"})
}
將表單發布回服務器后,我需要向Child.ValidatedProperty添加驗證。 ValidatedProperty中的值必須按升序排列。 對於給定的Child實體,如果任何先前的Child實體在ValidatedProperty中具有較高的值,或者如果以下任何Child實體具有較低的值,則ValidatedProperty無效。
當我嘗試實現此功能時,遇到以下問題:
當我嘗試驗證控制器操作並使用時
ModelState.AddModelError("Parent.Children.Child[" + i + "].ValidatedProperty", "Please enter a value between " + prev + " and " + next);
該消息未出現在屏幕上。
當我嘗試制作ValidationAttribute或使用IValidatableObject接口時,無法訪問之前和之后的Child實體,因此無法從那里進行驗證。
當我查看源代碼時,我的ValidationMessage html節點具有以下標記:
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Children[533f90da-4c11-40ca-bb07-e3f6bcbd7260].ValidatedProperty"></span>
所有建議都非常歡迎! 如果我需要提供更多信息,請告訴我您需要了解的內容。 謝謝!
PS:這是我正在嘗試做的簡化版本,真正的驗證比僅檢查正確的順序要復雜一些。
編輯:似乎對Html.BeginCollection的調用正在將children [533f90da-4c11-40ca-bb07-e3f6bcbd7260]部分添加到驗證元素的名稱。 當我刪除BeginCollection語句時,它顯示為:
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="ValidatedProperty"></span>
不幸的是,我需要BeginCollection語句來實現頁面的其他功能。 有什么方法可以使驗證消息與BeginCollection一起使用?
解決了:
當我像teo van kot建議的那樣使用EditorTemplate時,我可以刪除BeginCollectionItem語句,並且每個Child現在都以數字而不是guid為前綴。 現在,我的AddModelError語句可以正常工作。
我不確定,但是我想您用Html.RenderPartial()
破壞了綁定,這就是為什么當您使用ModelState.AddModelError()
添加錯誤時它不會出現的原因。
我建議您執行的操作是使用EditorTemplate而不是Html.RenderPartial()
。
您應該在Views\\Shared
創建文件夾EditorTemplates
,然后在其中為Model.Children
屬性創建與您的Children
屬性類型具有相同名稱的強類型視圖。
基本上,它將是現在與_Child
名稱相同的View。
然后更改:
@foreach (var child in Model.Children)
{
Html.RenderPartial("_Child", child);
}
至:
@Html.EditorFor(x => x.Children)
請注意,您不需要設置模型IEnumerable<YourType>
或List<YourType>
因為即使您通過集合,EditorTemplates仍然可以工作。
現在所有綁定都可以了。 您可以使用F12鍵在瀏覽器中對其進行檢查,並檢查ValidatedProperty
input
name
屬性。 然后,您將可以使用ModelState.AddModelError()
方法。
集合是根據索引進行評估的,但是您需要在模型內部引用集合名稱。 根據您的標記的ValidationMessage,模型狀態錯誤必須為:
ModelState.AddModelError("Parent[" + i + "].ValidatedProperty", "Please enter a value between " + prev + " and " + next);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.