Aar*_*nLS 24 generics asp.net-mvc razor
这适用于抓取标题(NOT VALUES):
@model IEnumerable<SomeModel>
...
<th>@Html.DisplayNameFor(m => m.SomeModelProperty)</th>
Run Code Online (Sandbox Code Playgroud)
如果SomeModelProperty是:
[Display(Name = "An Excellent Header")]
SomeModelProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后它会在标题th元素中显示"An Excellent Header" .
你会认为这不会起作用,因为模型是IEnumerable,它没有m.SomeModelProperty,但是它起作用,因为HtmlHelper有一个HtmlHelper<IEnumerable<TModel>>lambda的参数TModel不是IEnumerable<TModel>.由于这仅使用元数据,因此不需要集合中的项目.(虽然intellisense m.会欺骗你,让你认为它是一个集合).我不确定何时添加了这个很酷的重载,但是对于Index.cshtml来说非常方便,并且消除了@Html.DisplayNameFor(m => @Model.FirstOrDefault().SomeModelProperty)我想要避免的时髦事物.
http://msdn.microsoft.com/en-us/library/hh833697(v=vs.108).aspx
但是,当我的模型不是IEnumerable时,我无法弄清楚如何让它工作,而是包含IEnumerable作为属性,例如:
public class SomeList
{
public List<SomeModel> SomeModels { get; set; }
public int Page { get; set; }
public DateTime CurrentAsOf { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望明确使用泛型类型参数,但我认为类型参数是由从页面创建的HtmlHelper中逐渐减少的引擎指定的.我可以在页面中声明一个新的HtmlHelper,还是以某种方式明确指定类型参数?
Index.cshtml:
@model SomeList
//No idea how to do this:
@Html.DisplayNameFor<IEnumerable<SomeModel>>(m => m.SomeModelProperty)
Run Code Online (Sandbox Code Playgroud)
小智 42
即使没有行,另一个类似的解决方法可能是:
...
@{var dummy = Model.FirstOrDefault(); }
<tr>
<th>
@Html.DisplayNameFor(model => dummy.SomeModelProperty)
</th>
...
Run Code Online (Sandbox Code Playgroud)
我有完全相同的问题,因为我使用的是ViewModel,所以我有一个Viewnodel,其IEnumerable实际对象作为属性.
我确实遇到了这个帖子,如果你检查答案,那个人已经创建了自己的HTMLHelper来解决这个问题http://forums.asp.net/t/1783733.aspx.他的版本是:
public static MvcHtmlString DisplayColumnNameFor<TModel, TClass, TProperty>(
this HtmlHelper<TModel> helper, IEnumerable<TClass> model,
Expression<Func<TClass, TProperty>> expression)
{
var name = ExpressionHelper.GetExpressionText(expression);
name = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(
() => Activator.CreateInstance<TClass>(), typeof(TClass), name);
return new MvcHtmlString(metadata.DisplayName);
}
Run Code Online (Sandbox Code Playgroud)
您必须传递两个参数枚举和表达式而不是正常的表达式,因此您可能更喜欢@franz答案.我无法看到无论如何都必须传递2个参数,因为它需要知道要应用表达式的视图模型的哪个属性.
| 归档时间: |
|
| 查看次数: |
9016 次 |
| 最近记录: |