1

如何以任何我想要的方式格式化视图内的模型表示?能够实现我可以重用的自定义格式化程序。

例如 - 我有一个Model.Name值为“david kim”的值,我想将第一个字母大写。因此,它不会显示实际名称 - “ david kim ”,而是显示“ David Kim ”。

更多示例:

从字符串中删除数字:helloworld123 -> helloworld

将文本转换为 leet 语音: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);

        }
    }
}

不要忘记将以下行添加到 Web.Config 的 Views 文件夹中:

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

这将自动包含格式化程序和帮助程序扩展,因此您无需将其包含在要使用它的每个视图中。

于 2012-10-08T00:22:31.600 回答