簡體   English   中英

如何同時對多個對象進行驗證並將其添加到局部視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM