c# - 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.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);
}
推荐阅读
- python - 无法在 Jupyter 笔记本中使用预装的 python 包
- python - 在 python 中解析汤
- r - 如何在类网络对象的**超图**中转换矩阵
- react-native - 将 Skype for business 应用程序与 React Native 移动应用程序深度链接
- python - Django - 如何使用 JQuery Ajax 插入多个表单数据
- python - 如何小写我的部分网址地址的第一个字母?
- python - 如何在 Python 3 中扩展 datetime.date?
- python - 使用 Selenium 选择自动完成列表 - 在访问另一个列表之前必须关闭一个列表
- html - 使用 DIV 在 bootstrap 中对齐和缩放图像
- sql - 可以使用什么功能来防范幻读异常,而不是使用 Serializable 隔离级别?