У меня было похожее требование, но мне нужно было получить отображаемые имена для свойств из другого не перечисляемого класса, чтобы решение из @plurby не сработало. В итоге я решил эту проблему, создав свободный вызов, который можно использовать для получения нового HtmlHelper для любого произвольного типа. Код для расширения и адаптера:
public static class HtmlHelpers
{
public static HtmlHelperAdapter<TModel> Adapt<TModel>(this HtmlHelper<TModel> helper)
{
return new HtmlHelperAdapter<TModel>(helper);
}
public class HtmlHelperAdapter<TModel>
{
private readonly HtmlHelper<TModel> _helper;
public HtmlHelperAdapter(HtmlHelper<TModel> helper)
{
_helper = helper;
}
public HtmlHelper<TNewModel> For<TNewModel>()
{
return new HtmlHelper<TNewModel>(_helper.ViewContext, new ViewPage(), _helper.RouteCollection);
}
}
}
Затем вы можете использовать это в представлении так:
<td>@(Html.Adapt().For<MyOtherModel>().DisplayNameFor(m => m.SomeProperty))</td>
Одним из преимуществ является то, что этот подход будет работать для любого расширения HtmlHelper, а не только DisplayNameFor
(но имейте в виду, что адаптированный HtmlHelper не имеет никаких данных представления, поскольку все они типизированы на основе модели, используемой в и, следовательно, не будет работать в адаптированном HtmlHelper).