2012-02-22 27 views
1

我有一個非常混亂的問題,我能夠解決它,但必須有一個框外解決方案。MVC 3:在服務器端使用自動映射日期的非常自定義的格式

的情況如下: 在客戶側的用戶輸入的日期(即,具有日期選擇器),其輸出如下值到文本框:

禰22.02.2012(KW 8)

我有一個按鈕,我的表單與此文本框張貼到控制器的行動。 比方說,你有如下控制器動作,這需要的MyType作爲參數

[HttpPost] 
public ActionResult Create(MyType model) 
{ 
    //model.Date is always null 
    //(or in case the DateTime is not Nullable<T>, the value is DateTime.Min 
} 

public class MyType 
{ 
    public DateTime? Date { get; set; } 
} 

的問題很簡單: 如何映射輸入日期時間?

我不想性能在下面的例子中添加到我的班,如:

public class IDontWantThis 
{ 
    public DateTime? Date { get { /* Some custom string parsing with DateText */ } } 
    public string DateText { get; set; } //this would be the auto-mapped property 
} 

回答

1

如何在視圖中顯示日期與控制器無關。

我會添加一個隱藏字段,其中包含您希望日期時間在視圖模型上映射的屬性名稱(Date)。在客戶端上,使用javascript,只要隱藏字段包含需要使用的日期時間,就可以以任何您想要的方式格式化此日期。

因此,讓日期選擇器存儲選定的日期兩次,一次使用奇怪的日期格式顯示,另一次在a common format the modelbinder will understand的隱藏字段中。

+0

不錯!我沒有想到它。我的一個合作伙伴實際上剛剛在幾分鐘前向我提出了這個建議。有時候可能會這麼簡單。 :) – Shion 2012-02-22 15:12:12

+0

很高興我能幫忙! :-) – Peter 2012-02-22 15:31:41

1

這是什麼的ViewModels是。我知道你不希望你的域模型包括DateText成員,但你真的應該考慮這樣的事情:

public class MyType 
{ 
    public DateTime? Date { get; set; } 
} 

public class MyTypeViewModel 
{ 
    public MyType MyType { get; set; } 
    public string DateText { get; set; } 
} 

你的要求是什麼,使的ViewModels如此強大的要點之一。在視圖和模型之間使用中間類將它們鏈接在一起。這樣,模型中就不會有任何「格式化」數據的痕跡(MyType)。

+0

好的解決方案,但我想這次爲Viewmodels工作,因爲我們有一些與其他產品無關的東西,這種方法不會很好。 (這意味着:對我來說更多的編碼;)) – Shion 2012-02-22 15:11:31