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.MetaData
或 ModelExpression.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);
}
使用 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.MetaData
或 ModelExpression.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);
}