我正在为第一种类型创建一个Asp.net MVC站点。
我创建了一个详细信息页面,并使用了类似的内容:
<ul>
<li>
@Html.DisplayNameFor(m => m.MyProp)
@Html.DisplayFor(m => m.MyProp)
</li>
<ul>
我得到类似的东西:
<ul>
<li>
MyProp
MyPropValue
</li>
<ul>
我希望我的字段标题和我的字段值包含在单个Span的内部,所以我可以在全局css中格式化它,如下所示:
<ul>
<li>
<span class="field-label">MyProp</span>
<span class="field-value">MyPropValue</span>
</li>
<ul>
我想找到一种方法来做到这一点,而不必在一个范围内包围每个字段。我可以使用DisplayTemplate为DisplayFor方法解决这个问题,但我知道我需要为DisplayNameFor做这件事,每次我使用这个方法时它会自动生成span。
我考虑过为@Html.DisplayNameFor创建自己的替代方法,但是我对这个方法的签名有点困惑。
有人知道如何实现这个目标吗?
编辑:我尝试创建一个HtmlHelper扩展方法,如下面的方法:
public static IHtmlString OxDisplayNameFor<TModel, TField> (this HtmlHelper<TModel> helper, Expression<Func<TModel, TField>> expression)
{
return new HtmlString(String.Format(
"<span class='display-label'>{0}</span>", "XXX"));
}
唯一剩下的就是:我如何从表达式参数中获取值?
答案 0 :(得分:2)
签名与Html.DisplayNameFor
的签名相同:
public static MvcHtmlString DisplayWithDisplayNameFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression)
{
// construct a span tag and put html.DisplayNameFor(expression) in it
// then another span tag and put html.DisplayFor(expression) in it
// return all that
}
将它作为@helper
更方便,但你cannot have a generic helper因此无法将属性指向的lambdas传递给它,所以你能做的最接近的是:
@helper DisplayWithDisplayName(MvcHtmlString DisplayName, MvcHtmlString DisplayValue)
{
<span class="field-label">@DisplayName</span>
<span class="field-value">@DisplayValue</span>
}
然后您将其称为
@DisplayWithDisplayNameFor(Html.DisplayNameFor(m => m.MyProp), Html.DisplayFor(m => m.MyProp))