【问题标题】:Razor Tag Helper - Binding to a CollectionRazor Tag Helper - 绑定到集合
【发布时间】:2019-04-12 09:26:02
【问题描述】:

使用 ASP.NET Core 2.2 我正在尝试构建一个 Tag Helper 将绑定到代表集合的 ModelExpression SelectListItems。然后我希望能够访问和遍历列表中包含的SelectListItems

在代码方面,它看起来像这样......

[HtmlTargetElement("check-box-list", Attributes = "asp-for)]
public class CheckboxListTagHelper : TagHelper
{
    // Where the model is an IEnumerable<SelectItemList>
    [HtmlAttributeName("asp-for")]
    public ModelExpression AspFor { get; set; }

    public override async Task ProcessAsync(
        TagHelperContext context, TagHelperOutput output)
    {
        // I want to be able to reference the IEnumerable<SelectListItem>
        // represented by the model
        var modelItems = AspFor.Model as IEnumerable<SelectListItem>; // WRONG!
        ...
    }
}

我假设我需要使用 ModelExpression.MetaDataModelExpression.ModelExpolorer 属性,但我找不到任何可以指引我正确方向的信息。

一个不雅的解决方法是提供与附加属性相同的模型:

[HtmlAttributeName("select-item-list")]
public IEnumerable<SelectListItem> SelectItemList { get; set; }

但这在视图中看起来很乱:

<check-box-list
    asp-for="SelectedAuthorityLevels"
    checkbox-list="Model.SelectedAuthorityLevels" />

因为您绑定到同一个模型属性两次。

任何指导将不胜感激。

【问题讨论】:

  • 您是否尝试将属性名称从AspFor 更改为public ModelExpression For { get; set; } 之类的名称?

标签: c# asp.net-core tag-helpers asp.net-core-tag-helpers


【解决方案1】:

最后,答案很简单——因为我知道表达式类型,我可以简单地cast它如下:

var selectList = AspFor.Model as IEnumerable<SelectListItem>;

if (selectList == null) {
   var msg = "CheckboxList tag helper attribute 'asp-for' must of type " +
      "IEnumerable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>!";
   throw new Exception(msg);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多