Razor Tag Helper - 绑定到集合

Razor Tag Helper - Binding to a Collection

使用 ASP.NET Core 2.2 我正在尝试构建一个 Tag Helper 将绑定到代表 SelectListItems 集合的 ModelExpression。然后我希望能够访问和迭代列表中包含的 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" />

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

任何指导将不胜感激。

答案最终非常简单 - 因为我知道表达式类型,所以我可以简单地 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);
}