剃刀标签助手-绑定到集合

时间:2019-04-12 09:26:03

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

使用 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.MetaData属性,但是找不到任何指向正确方向的信息。

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

ModelExpression.ModelExpolorer

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

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

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

任何指导将不胜感激。

1 个答案:

答案 0 :(得分:0)

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