這是我的情況:在 ASP.NET Core 應用程序中,我需要從模型實例在 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”。該模型還具有所有可用選項的列表。我使用的 Web 前端框架支持單獨的data-summary屬性,需要在每個元素上設置該屬性<option>,以及為簡潔起見而在此處省略的其他屬性。選項之一由selected屬性預先選擇。我無法使用預定義的SelectListItem類,因為它不支持附加屬性。所以我創建了自己的SelectListOption類,它看起來相似但具有附加屬性。我有一個標簽助手,可以讓我這樣寫:<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>模型中元素的其他屬性。這很好用,但渲染頁面時會忽略選擇。因此,用戶將看到包含所有選項的列表,但缺少當前選擇。
1 回答

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