1

ビュー内のモデルのプレゼンテーションを好きなようにフォーマットするにはどうすればよいですか? 再利用できるカスタム フォーマッタを実装できること。

たとえばModel.Name、「david kim」という値を持つ があり、最初の文字を大文字にしたいとします。そのため、実際の名前 (" david kim ") を表示する代わりに、" David Kim " を表示します。

その他の例:

文字列から数字を削除: helloworld123 -> hellowworld .

テキストをリート音声に変換する: Hello world -> H3110 w0r1d .

それと同じくらい簡単なものを使用して:

// Here I use the Capital Letter custom formatter.
@Html.DisplayFormatFor(model => model.Address, new CapitalLetterFormatter())
4

1 に答える 1

1

これは、エレガントな再利用可能なコードとしてモデルをフォーマットするための私の実装です。

HtmlStringFormatter.Create()デリゲートを渡して独自の匿名フォーマッタを作成できる があります。

コードサンプル:

// This just upper case all the letters.
@Html.DisplayFormatFor(model => model.Address, HtmlStringFormatter.Create(s=> s.ToUpper()))

カスタム フォーマッタを作成する場合は、デリゲート プロパティから派生さHtmlStringFormatterせて、必要な操作に設定します。

コードサンプル:

// Here I use the Capital Letter custom formatter.
@Html.DisplayFormatFor(model => model.Address, new CapitalLetterFormatter())

すべてのクラス:

namespace MvcPlay.HelperExtensions
{
    public static class HelperExtensions
    {
        public static MvcHtmlString DisplayFormatFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, HtmlStringFormatter formatter)
        {
            var output = helper.DisplayFor(expression);
            string formatted = formatter.Delegate.Invoke(output.ToString());
            return MvcHtmlString.Create(formatted);
        }
    }
}

namespace MvcPlay.HtmlStringFormatting
{
    public class HtmlStringFormatter
    {
        public delegate string FormatDelegate(string s);

        public FormatDelegate Delegate;
        public Expression<FormatDelegate> formatExpression;

        private HtmlStringFormatter(FormatDelegate expression)
        {
            Delegate = expression;
        }

        protected HtmlStringFormatter()
        {

        }

        public static HtmlStringFormatter Create(FormatDelegate expression)
        {
            return new HtmlStringFormatter(expression);
        }
    }

    public class CapitalLetterFormatter : HtmlStringFormatter
    {
        public CapitalLetterFormatter()
        {
            Delegate =
                s => new CultureInfo("en-US", false).TextInfo.ToTitleCase(s).ToString(CultureInfo.InvariantCulture);

        }
    }
}

Views フォルダーの Web.Config に次の行を追加することを忘れないでください。

<add namespace="MvcPlay.HelperExtensions" />
<add namespace="MvcPlay.HtmlStringFormatting"/>

これにより、フォーマッターとヘルパー拡張機能が自動的に含まれるため、使用するすべてのビュー内に含める必要はありません。

于 2012-10-08T00:22:31.600 に答える