2012-05-15 4 views
4

Для следующего ActionLink вызова:Pass отображаемое_имя свойство в качестве параметра

@Html.ActionLink("Customer Number", "Search", new { Search = ViewBag.Search, q = ViewBag.q, sortOrder = ViewBag.CustomerNoSortParm, }) 

Я пытаюсь передать в ярлыке для @ model.CustomerNumber, чтобы генерировать «Номер клиента» текст вместо того, чтобы передать его в в явном виде. Есть ли equivilant из @ Html.LabelFor (model => model.CustomerNumber) для параметров?

ответ

3

Нет такого помощника из коробки.

Но это тривиально легко писать пользовательские один:

public static class HtmlExtensions 
{ 
    public static string DisplayNameFor<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> expression 
    ) 
    { 
     var htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
     var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
     return (metadata.DisplayName ?? (metadata.PropertyName ?? htmlFieldName.Split(new[] { '.' }).Last())); 
    } 
} 

, а затем использовать его (после чего пространство имен, в котором вы определили его в область видимости):

@Html.ActionLink(
    "Customer Number", 
    "Search", 
    new { 
     Search = ViewBag.Search, 
     q = ViewBag.q, 
     sortOrder = ViewBag.CustomerNoSortParm, 
     customerNumberDescription = Html.DisplayNameFor(model => model.CustomerNumber) 
    } 
) 
2

Да, но это уродливо.

ModelMetadata.FromLambdaExpression(m => m.CustomerNumber, ViewData).DisplayName 

Возможно, вы захотите обернуть это методом расширения.

2

Там в гораздо проще ответьте, ребята! Вам просто нужно ссылаться на индексированное значение первой строки, добавив «[0]» в «m => m.CustomerNumber»! (И, да, это будет работать, даже если нет ни одной строки значений!)

Html.DisplayNameFor(m => m[0].CustomerNumber).ToString() 

Чтобы поместить его в ссылке действие:

@Html.ActionLink(Html.DisplayNameFor(m => m[0].CustomerNumber).ToString(), "Search", new { Search = ViewBag.Search, q = ViewBag.q, sortOrder = ViewBag.CustomerNoSortParm, }) 

кусок пирога!

1

Эй довольно старая нить, но я получил лучший и простой ответ на это:

@Html.ActionLink(Html.DisplayNameFor(x=>x.CustomerName), "Search", new { Search = ViewBag.Search, q = ViewBag.q, sortOrder = ViewBag.CustomerNoSortParm, }) 
Смежные вопросы