我正在尝试创建一个自定义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
。
答案 0 :(得分:0)
如果我将扩展方法命名为LabelFor以外的其他方法,我就能成功完成此操作。当我将它命名为LabelForPascalCase时,我能够在我的视图中使用该功能。我认为扩展方法没有重载现有方法,因为它们具有相同的签名。