为了账号安全,请及时绑定邮箱和手机立即绑定

使用标签助手在选择元素中选择一个选项

使用标签助手在选择元素中选择一个选项

犯罪嫌疑人X 2024-01-03 16:29:22
这是我的情况:在 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不过也要记得打电话。


查看完整回答
反对 回复 2024-01-03
  • 1 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信