如何以任何我想要的方式在视图中格式化模型的表示? 能够实现我可以重用的自定义格式化程序。
例如 - 我有一个Model.Name
,其值为“david kim”,我希望将首字母大写。因此,它不是显示实际名称 - “ david kim ”,而是显示“ David Kim ”。
更多例子:
从字符串中删除数字: helloworld123 - > hellowworld
将文本转换为leet语音: Hello world - > H3110 w0r1d 。
使用简单的东西:
// Here I use the Capital Letter custom formatter.
@Html.DisplayFormatFor(model => model.Address, new CapitalLetterFormatter())
答案 0 :(得分: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"/>
这将自动包括Formatters和Helper Extension,因此您无需将其包含在要使用它的每个视图中。