2012-12-11 22 views
0

我有當用戶登錄時被實例化一個用戶對象,該對象存儲了所有用戶的設置應用跨用戶指定的日期時間設置:在MVC模型

public class SiteUser 
{ 

    public string LoginId { get; set; } 
    public string Name { get; set; }   
    public DateTime PasswordChangedOn { get; set; } 
    public string Language { get; set; } 
    public string DateFormat { get; set; } 
    public string RoleName { get; set; }   
    public ICollection<SitePermission> SitePermissions { get; set; } 
} 

而一個的UserContext類存儲和管理用戶的會話

public class UserContext 
    { 
     public SiteUser SiteUser { get; internal set; } 

     public static UserContext Current 
     { 
       get 
       { 
        if (HttpContext.Current == null || HttpContext.Current.Session == null) 
         return null; 

        if (HttpContext.Current.Session["UserContext"] == null) 
         CreateUserContext(); 

        return (UserContext)HttpContext.Current.Session["UserContext"]; 
       } 
      } 
    } 

現在,每當我有顯示日期,無論是在網格中,或在文本字段,我總是想引用SiteUser對象的DateFormat財產。

在大多數我看到的例子中,數據的註釋用於定義日期的格式,例如:

[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime PasswordChangedOn { get; set; } 

我已經嘗試過了修改,以這樣的:

[DataType(DataType.Date), DisplayFormat(DataFormatString = UserContext.Current.SiteUser.DateFormat, ApplyFormatInEditMode = true)] 

但它沒有工作,給我一個錯誤,說明屬性參數必須是一個常量。

那麼在MVC應用程序中將我的日期格式設置爲我的模型的最佳方法是什麼?

回答

1

您可以在您的視圖模型中添加一個屬性,並使用它來呈現日期,而不考慮用戶特定日期並在視圖中呈現該日期,例如

public string PasswordChangedOnLocal 
{ 
    get { return PasswordChangedOn.ToString(DateFormat); } 
} 

或者,你可以使用DateFormat財產只呈現在視圖本身的日期。如果稍後想要更改它(例如,進入系統範圍的約定),實際上會給您更多的靈活性,因爲您不需要重新編譯站點,例如

@model SiteUser 

... 
<div id="passwordChangedOn">@Model.PasswordChangedOn.ToString(Model.DateFormat)</div> 
... 
+0

所以,我需要在我的模型中的所有我的日期時間屬性的第二個屬性?例如,如果我有20個不同型號的50個日期時間屬性,我將不得不爲每個模型添加一個「OnLocal」變體? –

+0

我知道你的解決方案可以完成這項工作,但是這樣做有沒有更統一的方法?我真的很喜歡MVC的日期造型方式,唯一的缺點就是..格式必須硬編碼 –

+0

@ParityBit無論你如何處理它,所有你使用50個日期時間屬性的問題都會爲你提供同樣的問題這些日期需要手動格式化。通過引入基類可以輕鬆解決20種不同的模型。如果你有多個屬性字段,那麼我認爲直接在視圖中做它可能是最好的選擇。 – James