4

对于以下 ActionLink 调用:

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

我正在尝试传入@model.CustomerNumber 的标签以生成“客户编号”文本,而不必显式传递它。参数是否有 @Html.LabelFor(model => model.CustomerNumber) 的等价物?

4

4 回答 4

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)
    }
)
于 2012-05-15T13:49:27.400 回答
2

是的,但它很丑。

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

您可能希望将其包装在扩展方法中。

于 2012-05-15T13:47:48.803 回答
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, })

小菜一碟!

于 2013-07-13T00:42:37.103 回答
1

嘿,很老的线程,但我得到了一个更好更简单的答案:

@Html.ActionLink(Html.DisplayNameFor(x=>x.CustomerName), "Search", new { Search = ViewBag.Search, q = ViewBag.q, sortOrder = ViewBag.CustomerNoSortParm, })
于 2014-06-24T07:06:32.547 回答