我正在尝试创建一个自定义 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 属性指定一个。