【发布时间】:2011-12-18 03:16:32
【问题描述】:
我创建了一个名为 DisplayListBoxFor 的 HtmlHelper 方法,它需要在浏览器中将 MultiSelectList 中所选项目的文本表示形式显示为无序列表 (UL/LI)。我有特定的理由保持标准 ListBoxFor 和我的自定义 DisplayListBoxFor 之间的签名完全相同,这意味着我的方法需要接受 lambda 表达式。我的助手类中有以下代码,它是根据 Html.ListBoxFor 方法建模的:
public static MvcHtmlString DisplayListBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
{
TagBuilder tag = new TagBuilder("ul");
foreach (var value in ((MultiSelectList)selectList).SelectedValues)
{
TagBuilder itemTag = new TagBuilder("li");
itemTag.SetInnerText(value.ToString());
tag.InnerHtml += itemTag.ToString();
}
return new MvcHtmlString(tag.ToString());
}
然后我可以像这样调用我的自定义方法:
@Html.DisplayListBoxFor(x => Model.MySelectedValues, Model.MyAvailableValues)
我使用的类型如下:
Model.MySelectedValues = List<Object>
Model.MyAvailableValues = MultiSelectList
这工作得很好,除了输出只列出 ID 值而不是选定值的名称,因为这是在创建时存储在 MultiSelectList.SelectedValues 属性中的全部内容。我试图在我的 foreach 循环中找到一种方法来将所选值与值名称匹配,但由于该方法中的所有内容都是匿名类型,因此我无法将其转换为任何非具体值,甚至无法使用索引器查找 id 和 name 属性。我如何能够从传递给此方法的匿名类型中获取这些值?
【问题讨论】:
标签: model-view-controller html-helper anonymous-types