2013-08-19 58 views
1

我需要在ASP.NET MVC 3中創建一個顯示模板,該模板將顯示一個Timespan,僅顯示具有值集的屬性。這裏有一些例子來說明我的意思:僅顯示TimeSpan中的值顯示模板

Timespan: 1 day, 2 hours, 3 minutes 
Required display: "1 day, 2 hours, 3 minutes" 

Timespan: 0 days, 2 hours, 1 minute 
Required display: "2 hours, 1 minute" 

Timespan: 0 days, 5 hours, 0 minutes 
Required display: "5 hours" 

所以,你可以看到,我只需要顯示非零值;但我不知道如何......除了有許多如果陳述的不合理解決方案之外。我想找一個更好的方法。

這裏是我當前的代碼:

@model TimeSpan 

@if (Model.Days > 0) 
{ 
    @Model.Days if (Model.Days > 1) 
       {<text>days</text>} 
       else 
       { <text>day</text>} 
} 

@if (Model.Hours > 0) 
{ 
    if (Model.Days > 0) 
    { 
     @:, 
    } 
    @Model.Hours if (Model.Hours > 1) 
       {<text>hours</text>} 
       else 
       { <text>hour</text>} 
} 

@if (Model.Minutes > 0) 
{ 
    if (Model.Days > 0 || Model.Hours > 0) 
    { 
     @:, 
    } 
    @Model.Minutes if (Model.Minutes > 1) 
        {<text>minutes</text>} 
        else 
        { <text>minute</text>} 
} 
+0

爲什麼不把它解壓出來,然後調用一個實用程序或幫助程序? – Lloyd

+0

是的,我也可以將其作爲擴展方法提取出來,但要求的是邏輯/代碼結構。 – Kev

+1

我認爲彼得有一個類似於你的問題在他的問題的答案:http://stackoverflow.com/questions/842057/how-do-i-convert-a-timespan-to-a-formatted-string – Marco

回答

2

你可能會重構一個位(未經測試,不知道是否會@functions在模板文件中工作,但是......爲什麼不是嗎?)

@model TimeSpan 

@functions{ 
    public string FormatElement(int value, string text){ 
     if (value == 0) return string.Empty; 
     if (value > 1) text +="s"; 
     return string.Format("{0} {1}", value, text); 
    } 
} 

@string.Join(", ", new[]{ 
         FormatElement(Model.Days, "day"), 
         FormatElement(Model.Hours, "hour"), 
         FormatElement(Model.Minutes, "minute") 
        } 
        .Where(m => m != string.Empty));