亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在ASP.NET MVC中將自定義編輯器模板與IEnumerable模型一起使用的正確,慣用方式

在ASP.NET MVC中將自定義編輯器模板與IEnumerable模型一起使用的正確,慣用方式

慕標5832272 2019-12-26 14:12:04
快速刷新。什么時候:模型具有類型的屬性 IEnumerable<T>您將此屬性傳遞給Html.EditorFor()使用僅接受lambda表達式的重載您T在Views / Shared / EditorTemplates下具有該類型的編輯器模板然后MVC引擎將自動為可枚舉序列中的每個項目調用編輯器模板,并生成結果列表。例如,當存在一個Order具有property 的模型類時Lines:public class Order{    public IEnumerable<OrderLine> Lines { get; set; }}public class OrderLine{    public string Prop1 { get; set; }    public int Prop2 { get; set; }}并且有一個視圖Views / Shared / EditorTemplates / OrderLine.cshtml:@model [email protected](m => m.Prop1)@Html.EditorFor(m => m.Prop2)然后,當您@Html.EditorFor(m => m.Lines)從頂層視圖調用時,您將獲得一個頁面,其中包含每個訂單行的文本框,而不僅僅是一個。但是,正如您在鏈接的問題中看到的那樣,這僅在您使用的特定重載時才有效EditorFor。如果提供模板名稱(為了使用未在OrderLine類后命名的模板),則不會發生自動序列處理,而是會發生運行時錯誤。此時,您將必須將自定義模板的模型聲明為,IEnumebrable<OrderLine>并以某種方式手動遍歷其項目以輸出所有項目,例如@foreach (var line in Model.Lines) {    @Html.EditorFor(m => line)}這就是問題開始的地方。以這種方式生成的HTML控件均具有相同的ID和名稱。當您稍后對其進行POST時,模型綁定程序將無法構造OrderLines 的數組,而您在控制器的HttpPost方法中獲得的模型對象將為null。如果看一下lambda表達式,這是有道理的-它實際上并沒有將正在構造的對象鏈接到它所來自的模型中的某個位置。我嘗試了各種遍歷項目的方法,似乎唯一的方法是將模板的模型重新聲明為,IList<T>并使用進行枚舉for:@model IList<OrderLine>@for (int i = 0; i < Model.Count(); i++){     @Html.EditorFor(m => m[i].Prop1)    @Html.EditorFor(m => m[i].Prop2)}然后在頂級視圖中:@model TestEditorFor.Models.Order@using (Html.BeginForm()) {    @Html.EditorFor(m => m.Lines, "CustomTemplateName")}它提供了正確命名的HTML控件,這些模型控件可以在提交時由模型綁定程序正確識別。雖然這樣做有效,但感覺卻很不對勁。使用帶有的自定義編輯器模板的正確,慣用方式是什么EditorFor,同時保留所有允許引擎生成適合于模型綁定器的HTML的邏輯鏈接?
查看完整描述

3 回答

?
DIEA

TA貢獻1820條經驗 獲得超2個贊

與Erik Funkenbusch討論之后,導致研究了MVC源代碼,看來有兩種更好的方法(正確和慣用的嗎?)。


兩者都涉及為助手提供正確的html名稱前綴,并生成與default的輸出相同的HTML EditorFor。


我現在將其保留在此處,將進行更多測試,以確保它在深度嵌套的場景中可以工作。


對于以下示例,假設您已經有兩個用于OrderLine類的模板:OrderLine.cshtml和DifferentOrderLine.cshtml。


方法1-使用中間模板 IEnumerable<T>

創建一個幫助器模板,將其保存為任何名稱(例如“ ManyDifferentOrderLines.cshtml”):


@model IEnumerable<OrderLine>


@{

    int i = 0;


    foreach (var line in Model)

    { 

        @Html.EditorFor(m => line, "DifferentOrderLine", "[" + i++ + "]")

    }

}

然后從主訂單模板調用它:


@model Order


@Html.EditorFor(m => m.Lines, "ManyDifferentOrderLines")

方法2-不使用中間模板 IEnumerable<T>

在主訂單模板中:


@model Order


@{

    int i = 0;


    foreach (var line in Model.Lines)

    {

        @Html.EditorFor(m => line, "DifferentOrderLine", "Lines[" + i++ + "]")

    }

}


查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 590 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號