首页 > 解决方案 > Razor Tag Helper - 绑定到集合

问题描述

使用ASP.NET Core 2.2我正在尝试构建一个标签助手,它将绑定到一个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" />

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

任何指导将不胜感激。

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

解决方案


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

推荐阅读