2012-01-11 115 views
2

我目前已經把我所有的這些混亂放在ViewModel的頂部,這讓我感覺違反了DTO的目的。例如,這是我的看法車型之一的構造 -ASP.NET MVC在哪裏保留SelectLists的值

 Dictionary<int, string> chargeGroups = new Dictionary<int, string>(); 
     chargeGroups.Add(1, "Administration"); 
     chargeGroups.Add(2, "Annual Leave"); 
     chargeGroups.Add(3, "Bereavement"); 
     chargeGroups.Add(4, "Customer Installation, Setup & Training"); 
     chargeGroups.Add(5, "Customer Support"); 
     chargeGroups.Add(6, "Internal Training & Education"); 
     chargeGroups.Add(7, "Sales & Marketing"); 
     chargeGroups.Add(8, "Sick"); 
     chargeGroups.Add(9, "Software Devel/Maint/Test"); 
     chargeGroups.Add(10, "Software Upgrade/Patch"); 
     chargeGroups.Add(11, "Other"); 
     chargeGroups.Add(12, "Other Absence"); 
     chargeGroups.Add(13, "Warranty"); 
     chargeGroups.Add(14, "Public Holiday"); 
     chargeGroups.Add(15, "Other Paid Leave"); 

     ChargeGroups = new SelectList(chargeGroups, "Key", "Value"); 

我的視圖模型:

[DisplayName("Charge group")] 
    public short? ChargeGroup { get; set; } 

    public SelectList ChargeGroups; 

然後在我看來:

  <div class="editor-label"> 
       @Html.LabelFor(model => model.ChargeGroup) 
      </div> 
      <div class="editor-field"> 
       @Html.DropDownListFor(model => model.ChargeGroup, Model.ChargeGroups) 
       @Html.ValidationMessageFor(model => model.ChargeGroup) 
      </div> 

在哪裏,我應該把這個東東?

+1

那麼,因爲這是一個ViewModel,而不是模型,我沒有看到一個問題在這裏。這與渲染視圖有關,因此在ViewModel中是有意義的。在回發之前,我會在發送到數據庫之前將其轉換爲模型,以便您不違反DTO ...無論如何,我對其他人的意見感興趣。 – 2012-01-11 19:30:18

+0

我同意@JohnKalberer。 ViewModel不一定是完全貧血的DTO,它可以包含與視圖相關的邏輯。我會在控制器中使用邏輯(或由其使用)來將傳入的ViewModel數據轉換爲Model業務層,然後轉換回傳出的ViewModel數據。 (一方面注意:爲什麼在業務模型中有一個「SelectList」?是不是'SelectList'特別是一個MVC UI元素?業務模型不應該與UI實現緊密結合) – David 2012-01-11 19:35:07

+0

我的意思是說ViewModel不是模型對不起。 [post edited] – NoPyGod 2012-01-11 20:23:35

回答

0

我決定保留另一個名爲OtherData的類的選擇列表的值,它位於我的模型文件中我的主DBContext類旁邊。

0

我認爲從數據源加載數據並通過輔助方法呈現基於該數據的控件後緩存該數據將是更好的解決方案。

+0

它不是從數據源加載的,它只是一個值的數組。我主要關心的是我在哪裏保存值的數組?在ViewModel上,在控制器上? Viewbag .. etc – NoPyGod 2012-01-11 20:26:18

+0

這就是爲什麼我說從數據源加載它,導致該列表中的每個更改都需要重新編譯,重新部署,並且它沒有任何意義,即使您可以將它保存在資源或xml文件中 – 2012-01-12 06:30:01

5

當我有一個不會改變的值列表時,我通常使用一個Enum,然後使用一個自定義的Html Helper來渲染出一個選擇列表。您可以使用元數據描述標記來定製枚舉值的顯示文本。

這樣,你可以只使用:

<%: Html.EnumDropDownListFor(model => model.EnuProperty) %> 

@Html.EnumDropDownListFor(model => model.EnuProperty) 

退房這個職位由西蒙它允許您使用的Meta Description屬性來customzie輸出的枚舉名稱:

How do you create a dropdownlist from an enum in ASP.NET MVC?

這裏是另一個例子,但是它缺乏meta描述屬性:

http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums.aspx

編輯

你枚舉可能是這個樣子

public enum ChargeGroupEnum 
{ 
    [Description("Administration")] 
    Administration=1, 
    [Description("Annual Leave")] 
    AnnualLeave=2, 
    [Description("Bereavement")] 
    Bereavement=3, 
    [Description("Customer Installation, Setup & Training")] 
    CustomerInstallation=4, 
    [Description("Customer Support")] 
    CustomerSupport=5, 
    [Description("Internal Training & Education")] 
    InternalTraining=6, 
    [Description("Sales & Marketing")] 
    SalesMarketing=7, 
    [Description("Sick")] 
    Sick=8, 
    [Description("Software Devel/Maint/Test")] 
    Development=9, 
    [Description("Software Upgrade/Patch")] 
    Upgrade=10, 
    [Description("Other")] 
    Other=11, 
    [Description("Other Absence")] 
    OtherAbsence=12, 
    [Description("Warranty")] 
    Warranty=13, 
    [Description("Public Holiday")] 
    PublicHoliday=14, 
    [Description(")ther Paid Leave")] 
    OtherPaidLeave=15 
} 

,然後在您的視圖模型,你可以使用下面的做該字段以無值開始並且需要值:

[Required(ErrorMessage=" * required")] 
public ChargeGroupEnum? ChargeGroup {get;set;} 

然後在你看來,你會使用Html Helper「ChargeGroupEnum」,你需要從我鏈接的帖子中獲得。

@Html.EnumDropDownListFor(model => Model.ChargeGroup) 

如果你的模型有一個Int,你可以很容易地從Enum => Int和Int => Enum進行轉換。

+0

嗨!請將您的示例更改爲Razor語法。 @NoPyGod正在使用Razor ... – 2012-01-11 19:49:56

+1

我已更新示例以包括如何從Razor調用Html Helper。邏輯不會改變,您可以像使用MVC中的任何其他幫助器方法(Html,Url等)一樣使用它。 – 2012-01-11 19:53:09

+0

有趣的方法。枚舉存儲在Viewmodel上嗎? – NoPyGod 2012-01-11 20:25:27

-3
public static List<string> PaymentCurrency = new List<string> { "USD", "GBP", "EUR", "AUD", "BRL", "CAD", "CHF", "CLP", "CNY", "CZK", "DKK", "FJD", "HKD", "HNL", "HUF", "IDR", "ILS", "INR", "ISK", "JPY", "KRW", "LVL", "MXN", "MYR", "NOK", "NZD", "PHP", "PKR", "PLN", "RUB", "SEK", "SGD", "THB", "TRY", "TWD", "ZAR" }; 

List<SelectListItem> PaymentCurrencyOptionItems = new List<SelectListItem>() { new SelectListItem { Text = "", Value = "" } }; 
    PaymentCurrencyOptionItems.AddRange(Lolio.PaymentCurrency.Select(r => new SelectListItem { Text = r+" "+LangResources.Get("Currency_" + r), Value = r })); 

IEnumerable<SelectListItem> LinkPaymentType = new SelectList(PaymentTypeOptionItems, "Value", "Text", lnk.Performance.PaymentType); 

Html.DropDownListFor(m => m.PaymentType, LinkPaymentType)) 
+0

這不是很有幫助,你根本沒有回答我的問題。 – NoPyGod 2012-01-11 20:10:43

0

在視圖和視圖模型中創建SelectList是否更理想,因此視圖模型不與視圖對象緊密耦合(SelectList)?

我知道一個視圖模型是爲了使視圖更加緊密地耦合而成的,但理論上如果視圖與不使用SelectList的東西交換出來,如果視圖模型沒有使用,您可以重用更多的視圖模型不使用該SelectList。