這是我的情況:在 ASP.NET Core 應(yīng)用程序中,我需要從模型實(shí)例在 Razor 視圖中生成以下 HTML 代碼:<select name="CultureName"> <option value="de-DE" data-summary="Deutsch (Deutschland)">* Deutsch (Deutschland)</option> <option value="de-AT" data-summary="Deutsch (?sterreich)">* Deutsch (?sterreich)</option> <option value="de-CH" data-summary="Deutsch (Schweiz)">* Deutsch (Schweiz)</option> <option value="en-GB" data-summary="Englisch (Gro?britannien)" selected>Englisch (Gro?britannien)</option> ^^^^^^^^- important! <option value="en-US" data-summary="Englisch (USA)">Englisch (USA)</option></select>模型的屬性CultureName值為“en-GB”。該模型還具有所有可用選項(xiàng)的列表。我使用的 Web 前端框架支持單獨(dú)的data-summary屬性,需要在每個(gè)元素上設(shè)置該屬性<option>,以及為簡(jiǎn)潔起見(jiàn)而在此處省略的其他屬性。選項(xiàng)之一由selected屬性預(yù)先選擇。我無(wú)法使用預(yù)定義的SelectListItem類,因?yàn)樗恢С指郊訉傩浴K晕覄?chuàng)建了自己的SelectListOption類,它看起來(lái)相似但具有附加屬性。我有一個(gè)標(biāo)簽助手,可以讓我這樣寫(xiě):<select asp-for="CultureName"> @foreach (var culture in Model.Cultures) { <option item="@culture"></option> }</select>這是代碼:[HtmlTargetElement("option", ParentTag = "select", Attributes = "item")]public class OptionTagHelper : TagHelper{ public SelectListOption Item { get; set; } public override void Process(TagHelperContext context, TagHelperOutput output) { if (Item != null) { output.Content.SetContent(Item.Text); output.Attributes.SetAttribute("value", Item.Value); if (Item.Summary != null) output.Attributes.SetAttribute("data-summary", Item.Summary); if (Item.HtmlText != null) output.Attributes.SetAttribute("data-html", Item.HtmlText); if (Item.HtmlSummary != null) output.Attributes.SetAttribute("data-summary-html", Item.HtmlSummary); } }}它填充<option>模型中元素的其他屬性。這很好用,但渲染頁(yè)面時(shí)會(huì)忽略選擇。因此,用戶將看到包含所有選項(xiàng)的列表,但缺少當(dāng)前選擇。
1 回答

慕慕森
TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
你沒(méi)有對(duì) 做任何事情asp-for
。這不是魔法。如果您查看其中一個(gè)內(nèi)置標(biāo)記幫助程序的代碼,您將看到它們具有用于捕獲此內(nèi)容的屬性,大致如下:
[HtmlAttributeName("asp-for")] public ModelExpression For { get; set; }
然后,您必須使用此屬性通過(guò)讀取值來(lái)實(shí)際設(shè)置所選選項(xiàng)。盡管如此,如果您簡(jiǎn)單地從 繼承標(biāo)簽助手SelectTagHelper
,然后重寫(xiě)Process
以執(zhí)行您自己的邏輯,您可能會(huì)得到更好的服務(wù)。base.Process
不過(guò)也要記得打電話。
- 1 回答
- 0 關(guān)注
- 173 瀏覽
添加回答
舉報(bào)
0/150
提交
取消