Я пытаюсь создать специальную поддержку LabelFor для применения по умолчанию вместо стандартного помощника LabelFor в System.Web.Mvc.Html. Я хочу, чтобы моя LabelFor использовала свойства модели PascalCase и создала метку, которая отображается как несколько слов. Например, свойство FirstName
появится как «Имя».ASP.Net MVC3 VB.Net Custom LabelFor HtmlHelper не работает
Я нашел this post, в котором показано, как создать пользовательский метод LabelFor, который позволяет добавлять атрибуты html.
Я воссоздал этот помощник в 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
, но когда я добавить объявление пространства имен для этого модуля все в остальной части проекта идет наперекосяк. Например, каждая из моих моделей имеет свойство Primary Key, которое является типом данных Guid
, и как только я добавлю пространство имен выше в модуль, я получаю несколько ошибок, заявляя, что System.Guid is not defined
среди других подобных ошибок.
Я попытался импортировать пространство имен проектов в представление, чтобы использовать пользовательский помощник, но затем я получаю сообщение об ошибке Overload resolution failed because no 'LabelFor' is most specific for these arguments
.
Я застрял. Может ли кто-нибудь помочь?
Я стараюсь не указывать DisplayName
для каждого свойства PascalCase, которое у меня есть во многих моделях.
Я не эксперт VB, но почему вы заявляете его как модуль, а не как статический класс? Кроме того, добавление пространства имен может помочь. С уважением. – Oscar
Модуль VB - это то же самое, что и статический класс C#. Как я уже упоминал выше, я попытался добавить пространство имен 'System.Web.Mvc.Html', но это нарушило другие ссылки на объекты' System' в моем проекте. – Brian
Я имею в виду ваше собственное пространство имен. – Oscar