第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

慕標(biāo)5832272 2019-12-26 14:12:04
快速刷新。什么時候:模型具有類型的屬性 IEnumerable<T>您將此屬性傳遞給Html.EditorFor()使用僅接受lambda表達式的重載您T在Views / Shared / EditorTemplates下具有該類型的編輯器模板然后MVC引擎將自動為可枚舉序列中的每個項目調(diào)用編輯器模板,并生成結(jié)果列表。例如,當(dāng)存在一個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 TestEditorFor.Models.OrderLine@Html.EditorFor(m => m.Prop1)@Html.EditorFor(m => m.Prop2)然后,當(dāng)您@Html.EditorFor(m => m.Lines)從頂層視圖調(diào)用時,您將獲得一個頁面,其中包含每個訂單行的文本框,而不僅僅是一個。但是,正如您在鏈接的問題中看到的那樣,這僅在您使用的特定重載時才有效EditorFor。如果提供模板名稱(為了使用未在OrderLine類后命名的模板),則不會發(fā)生自動序列處理,而是會發(fā)生運行時錯誤。此時,您將必須將自定義模板的模型聲明為,IEnumebrable<OrderLine>并以某種方式手動遍歷其項目以輸出所有項目,例如@foreach (var line in Model.Lines) {    @Html.EditorFor(m => line)}這就是問題開始的地方。以這種方式生成的HTML控件均具有相同的ID和名稱。當(dāng)您稍后對其進行POST時,模型綁定程序?qū)o法構(gòu)造OrderLines 的數(shù)組,而您在控制器的HttpPost方法中獲得的模型對象將為null。如果看一下lambda表達式,這是有道理的-它實際上并沒有將正在構(gòu)造的對象鏈接到它所來自的模型中的某個位置。我嘗試了各種遍歷項目的方法,似乎唯一的方法是將模板的模型重新聲明為,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條經(jīng)驗 獲得超3個贊

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


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


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


對于以下示例,假設(shè)您已經(jīng)有兩個用于OrderLine類的模板:OrderLine.cshtml和DifferentOrderLine.cshtml。


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

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


@model IEnumerable<OrderLine>


@{

    int i = 0;


    foreach (var line in Model)

    { 

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

    }

}

然后從主訂單模板調(diào)用它:


@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++ + "]")

    }

}


查看完整回答
反對 回復(fù) 2019-12-26
  • 3 回答
  • 0 關(guān)注
  • 595 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號