2012-11-13 88 views
3

我是MVC3的新手,我仍然試圖抓住良好的編程習慣。我有一段時間試圖格式化日期時間?顯示在我的MVC3項目中,該項目沒有與日期來自的類相關聯的顯式ModelName.cs文件。MVC3格式可爲空TextBoxFor中的DateTime而不更改模型

我們已經有了一個數據庫,並使用一個.edmx(我們稱之爲Pooling.edmx)來獲取我們的模型。我顯然不想編輯設計器文件以適應這種廣泛接受的解決方案:Date only from TextBoxFor()

然後,我試過其他的解決方案,我發現這裏:它採用Using Html.TextBoxFor with class and custom property (MVC)

@Html.TextBoxFor(m => m.Name, new { data_bind="value: Name", @class = "title width-7" }) 

這個工作,因爲我是能夠使用自定義屬性,加類名,並設置一個值都在一旦。

我轉變了這個:

@Html.TextBoxFor(m => Model.PrePoolOwner.OglDateEffective, new Dictionary<string, object> { { "class", "check-dirty input-small datePicker" }, { "data-original-value", @Model.PrePoolOwner.OglDateEffective } }) 

到這個(這似乎真難看......並導致我的問題):

@Html.TextBoxFor(m => Model.PrePoolOwner.OglDateEffective, new { data_original_value = Model.PrePoolOwner.OglDateEffective.HasValue ? Model.PrePoolOwner.OglDateEffective.Value.ToString("MM/dd/yyyy") : null, @class = "datePicker check-dirty", @Value = Model.PrePoolOwner.OglDateEffective.HasValue ? Model.PrePoolOwner.OglDateEffective.Value.ToString("MM/dd/yyyy") : null }) 

是更好地找到並使用這些其他方式(如下劃線將轉換成破折號等)來顯示信息,或者我應該有一個ModelName.cs文件來改變它在模型級別的顯示方式嗎?

出於某種原因,我覺得有一個巨大的Pooling.edmx文件,映射出我們的數據庫,現在限制了我們,並且將來我們將如何隨着網站的發展訪問/呈現/更改數據。

爲了得到這是由Model.PrePoolOwner.OglDateEffective調用上面一個「PrePoolOwner」對象,我們有一個PrePoolOwnerRow.cs文件的作用:

namespace OCC_Tracker.Models 
{ 
    public class PrePoolOwnerRow 
    { 
     public bool Dirty { get; set; } 
     public bool Delete { get; set; } 

     public PrePoolOwner PrePoolOwner { get; set; } 

     public PrePoolOwnerRow(PrePoolOwner owner) 
     { 
      this.Dirty = false; 
      this.Delete = false; 
      this.PrePoolOwner = owner; 
     } 

     public PrePoolOwnerRow() 
     { } 
    } 
} 

然後,我們在我們的.cshtml頂部調用文件

@model OCC_Tracker.Models.PrePoolOwnerRow 
+1

您是否將視圖綁定到.edmx模型?如果是這樣,你不應該這樣做 - 總是創建視圖模型綁定到你的MVC視圖。 –

+0

是的,聽起來像你將視圖綁定到域/實體模型。您應該在MVC項目中設置單獨的視圖模型,然後將您的域/實體模型映射到視圖模型。 –

+0

閱讀[本文](http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/)幫助我理解視圖模型與領域模型。 –

回答

1

好的,這麼幾點建議。

首先,在您的示例中,PrePoolOwnerRow是您的視圖模型。這本身就很好。但代碼氣味是您通過您的視圖模型PrePoolOwnerRow公開PrePoolOwner - 域實體的位置。

我建議所以第一件事就是更新您的視圖模型的東西更是這樣的:

public class PrePoolOwnerModel 
{ 
    public bool Dirty { get; set; } 
    public bool Delete { get; set; } 

    public DateTime? OglDateEffective { get; set; } 
    public String OglDateEffective { get; set; } 

    // Other public properties here that map to properties on your PrePoolOwner entity. 
} 

所有我這裏是下降的參考域模型,並與(一個PLACEHOLD評論更換到)您的視圖所需的模型中的屬性。

在你的控制,你的抓取模式PrePoolOwner,並將其映射到使用AutoMapper您的視圖模型(這是一個假設的例子,因爲我不知道你的觀點是這樣做):

public ViewResult Index(int id) 
{ 
    PrePoolOwner entity = myservice.GetPrePoolOwner(id); 

    PrePoolOwnerModel model = Mapper.Map<PrePoolOwnerModel>(entity); 

    return View(model); 
} 

現在,爲了解決DateTime文本框的問題,你應該看看使用MVC編輯器模板(這是另一個主題,但Google it找到涵蓋這個主題的許多主題)。這使得您可以在類似類型的渲染元素(即DateTime)上提供更大的靈活性和可重用性。

但是,除了使用它,您可以添加另一個屬性到您的模型,並使用AutoMapper適當地設置DateTime。所以,這樣的事情在你的控制器,execpt你會建立一個映射AutoMapper來處理這個問題:

public class PrePoolOwnerModel 
{ 
    .... 
    public String OglDateEffectiveValue { get; set; } 
    .... 
} 

public ViewResult Index(int id) 
{ 
    .... 
    model.OglDateEffectiveValue = model.OglDateEffective.HasValue ? 
            model.OglDateEffective.Value.ToString("MM/dd/yyyy") : 
            String.Empty; 
    .... 
} 

一旦建立起來,你可以在使用這個新的模型屬性(OglDateEffectiveValue)爲您的屬性你的文本框。

我知道有很多我介紹了那裏,但挖掘與建模視圖模型這樣的,並使用AutoMapper的數據,如您需要它是你的觀點映射到您的視圖模型正是實驗。

保持您的查看邏輯很簡單。避免在場合循環之外使用任何瘋狂的東西,也許在這裏或那裏有條件的話。

+0

謝謝你使它非常清楚!這對我很有幫助。 – blapsley

相關問題