Jaki jest najlepszy sposób pobrania atrybutu wyświetlanej nazwy dla elementu w modelu? Widzę wielu ludzi używających programu pomocniczego LabelFor do wszystkiego, ale etykieta nie jest odpowiednia, jeśli chcę tylko wyświetlić listę danych. Czy istnieje prosty sposób uzyskania atrybutu Name, jeśli chcę go wydrukować, na przykład akapit?Uzyskaj atrybut DisplayName bez używania programu LabelFor Helper w asp.net MVC
Odpowiedz
<p>
<%= Html.Encode(
ModelMetadata.FromLambdaExpression<YourViewModel, string>(
x => x.SomeProperty, ViewData).DisplayName
) %>
<p>
Oczywiście w celu uniknięcia kod spaghetti to jest zawsze dobry pomysł, aby napisać pomocnika:
public static class HtmlExtensions
{
public static MvcHtmlString GetDisplayName<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression
)
{
var metaData = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
string value = metaData.DisplayName ?? (metaData.PropertyName ?? ExpressionHelper.GetExpressionText(expression));
return MvcHtmlString.Create(value);
}
}
, a następnie:
<p>
<%: Html.GetDisplayName(x => x.SomeProperty) %>
</p>
Moim zdaniem należy użyć ciąg znaków jako typ wyniku, ponieważ w przeciwnym razie pominie się mechanizm kodowania. Inną kwestią jest to, że potrzebujesz DisplayName w niektórych przypadkach jako ciąg znaków (tj. Wypełnij kolumny w klasie WebGrid).
Należy starać nowy istniejącą funkcję:
<% Html.DisplayNameFor(m => m.YourProperty) %>
Brzytwa: @ Html.DisplayNameFor (model => model.SomeProperty) –
Wiele prostsze niż zaakceptowana odpowiedź. – VDWWD
Dziękuję, to jest dokładnie to, co ja jestem po plus więcej! –
Zauważ, że potrzebujesz następującego 'using's dla tego: using System.Linq; przy użyciu System.Linq.Expressions; –
Jakie są implikacje związane z wydajnością tego działania? Podoba mi się pomysł użycia tego we wszystkich widokach, ale brzmi to o wiele bardziej skomplikowanie niż tylko tekst w .cshtml – Farinha