2012-06-20 3 views
1

Я пытаюсь создать специальную поддержку 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, которое у меня есть во многих моделях.

+0

Я не эксперт VB, но почему вы заявляете его как модуль, а не как статический класс? Кроме того, добавление пространства имен может помочь. С уважением. – Oscar

+0

Модуль VB - это то же самое, что и статический класс C#. Как я уже упоминал выше, я попытался добавить пространство имен 'System.Web.Mvc.Html', но это нарушило другие ссылки на объекты' System' в моем проекте. – Brian

+0

Я имею в виду ваше собственное пространство имен. – Oscar

ответ

0

Я смог сделать это успешно, если я назвал свой метод расширения чем-то иным, чем LabelFor. Когда я назвал его LabelForPascalCase, я смог использовать эту функцию в своих представлениях. Я думаю, что метод расширения не перегружал существующий метод, потому что у них была одна и та же подпись.

Смежные вопросы