ASP.Net MVC3 VB.Net Custom LabelFor HtmlHelper无法正常工作

时间:2012-06-20 15:17:19

标签: vb.net asp.net-mvc-3 razor extension-methods html-helper

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

我发现this post显示了如何创建一个允许添加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中包含此模块,但是当我将命名空间声明添加到此模块时,项目其余部分的所有内容都变得混乱。例如,我的每个模型都有一个{Key}属性Guid数据类型,一旦我将上面的名称空间添加到模块中,我就会收到几个错误,说明System.Guid is not defined和其他类似的错误。

我尝试将项目命名空间导入到视图中以使用自定义帮助程序,但后来出现Overload resolution failed because no 'LabelFor' is most specific for these arguments错误。

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

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

1 个答案:

答案 0 :(得分:0)

如果我将扩展方法命名为LabelFor以外的其他方法,我就能成功完成此操作。当我将它命名为LabelForPascalCase时,我能够在我的视图中使用该功能。我认为扩展方法没有重载现有方法,因为它们具有相同的签名。