2012-10-08 60 views
1

如何以任何我想要的方式在視圖內格式化模型的表示? 能夠實現我可以重複使用的自定義格式化程序。視圖中的可重複使用的模型格式

例如 - 我有一個Model.Name它的值「大衛金」,我想大寫的第一個字母。因此,而不是顯示實際名稱 - 「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()) 

回答

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:

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

Th將自動包括格式化程序和助手擴展,因此您不需要將其包含在您要使用它的每個視圖中。

相關問題