System.Web.Mvc.Html に含まれる標準の LabelFor ヘルパーの代わりに、デフォルトで適用するカスタム 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
データ型である Primary Key プロパティがあり、上記の名前空間をモジュールに追加するとすぐに、System.Guid is not defined
他の同様のエラーの中でそれを示すいくつかのエラーが発生します。
カスタム ヘルパーを使用するために、プロジェクトの名前空間をビューにインポートしようとしましたが、次のようなエラーが表示されますOverload resolution failed because no 'LabelFor' is most specific for these arguments
。
私は立ち往生しています。誰でも助けることができますか?
DisplayName
多くのモデルで持っているすべての PascalCase プロパティを指定する必要がないようにしています。