1

我正在尝试创建一个自定义 LabelFor 帮助程序以默认应用,而不是 System.Web.Mvc.Html 中包含的标准 LabelFor 帮助程序。我希望我的 LabelFor 采用 PascalCase 模型属性并制作一个显示为多个单词的标签。例如,该属性FirstName将显示为“名字”。

我发现这篇文章展示了如何制作一个允许添加 html 属性的自定义 LabelFor 助手。

我在 VB.Net 中重新创建了这个助手并修改它来做我想做的事,但我无法让它工作。

Imports System.Linq.Expressions
Imports System.Runtime.CompilerServices

Public Module LabelExtensions

    <Extension()> _
    Public Function LabelFor(Of Tmodel, TValue)(html As HtmlHelper(Of Tmodel), expression As Expression(Of Func(Of Tmodel, TValue))) As MvcHtmlString
        Dim metadata As ModelMetadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData)
        Dim htmlFieldName As String = ExpressionHelper.GetExpressionText(expression)
        Dim labelText As String = If(metadata.DisplayName, If(metadata.PropertyName, htmlFieldName.Split(".").Last()))

        If String.IsNullOrEmpty(labelText) Then Return MvcHtmlString.Empty

        labelText = Regex.Replace(labelText, ".[A-Z]", Function(m) m.ToString()(0) & " " & Char.ToLower(m.ToString()(1)))

        Dim tag As TagBuilder = New TagBuilder("label")
        tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName))
        tag.SetInnerText(labelText)

        Return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal))
    End Function

该示例包含此模块,Namespace System.Web.Mvc.Html但是当我将名称空间声明添加到此模块时,项目其余部分中的所有内容都变得混乱。例如,我的每个模型都有一个作为Guid数据类型的主键属性,一旦我将上面的命名空间添加到模块中,我就会收到几个错误,说明这些错误System.Guid is not defined以及其他类似错误。

我试图将我的项目命名空间导入到视图中以使用自定义帮助程序,但随后我收到一条错误消息Overload resolution failed because no 'LabelFor' is most specific for these arguments

我被困住了。有人可以帮忙吗?

我试图避免DisplayName为我在许多模型中拥有的每个 PascalCase 属性指定一个。

4

1 回答 1

0

如果我将扩展方法命名为 LabelFor 以外的名称,我就能成功地做到这一点。当我将它命名为 LabelForPascalCase 时,我能够在我的视图中使用该函数。我认为扩展方法没有重载现有方法,因为它们具有相同的签名。

于 2012-07-18T12:53:25.550 回答