1

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 プロパティを指定する必要がないようにしています。

4

1 に答える 1

0

拡張メソッドに LabelFor 以外の名前を付けた場合、これを正常に行うことができました。LabelForPascalCase という名前を付けたとき、ビューでその関数を使用できました。拡張メソッドは同じシグネチャを持っていたため、既存のメソッドをオーバーロードしていなかったと思います。

于 2012-07-18T12:53:25.550 に答える