1

從閱讀很多關於如何在各種網站上設置下拉菜單的教程,我已經設法將幾件事情合併起來,仍然卡住。在ASP.NET MVC中如何將「視圖模型」包含到「視圖」中存在困惑

我已經告訴我下面的代碼應該被包含在一個視圖模型,它是目前在我的視圖頂部:

var genderItems = new List<ListItem> 
    { 
      new ListItem { Text = "Unisex", Value = "0" }, 
      new ListItem { Text = "Female", Value = "1" }, 
      new ListItem { Text = "Male", Value = "2" } 
    }; 

var statusItems = new List<ListItem> 
    { 
      new ListItem { Text = "Inactive", Value = "0" }, 
      new ListItem { Text = "Active", Value = "1" } 
    }; 

在同一視圖中我一直在使用這個代碼生成一個下拉框:

@Html.DropDownList("RoomGender", new SelectList(genderItems, "Value", "Text", Model.RoomGender)) 

可能有人請解釋一下我應該如何摘要,然後將它傳遞給視圖不刪除已連接Room模型,我有,因爲這是模型,用於數據爲數據庫。

這可能很簡單,我試過研究它,但我真的很努力將它拼湊在一起。

+1

您也可以使用枚舉用於顯示性別 –

+0

我試圖用枚舉前幾天的下拉菜單,擁有一切存儲到SE雖然很好,但爲選擇下拉元素的值而掙扎。 –

+0

爲了您對模型和viewModel的困惑,你可以看看這一個http://stackoverflow.com/questions/4061440/asp-net-mvc-model-vs-viewmodel和使用枚舉的一部分,我會添加一些代碼! –

回答

1

是不是這個Room模型已經是您的視圖模型?視圖模型只是一個包含視圖需要的數據的類。約定它們傾向於被稱爲視圖模型以將它們與領域模型分開。在你的情況下,你可以添加幾個屬性RoomStatusItemsGenderItems。或者,使用Room和2個列表屬性創建一個RoomViewModel,然後將其傳遞給View。

理想情況下,您將創建一個RoomViewModel併爲您需要在視圖中顯示的所有數據創建屬性。這並不需要與你的域對象的結構相匹配。在你的MVC層中,你需要從視圖中檢索數據的域對象,並在視圖模型創建期間映射這些屬性。您可以手動執行此操作,也可以使用Automapper之類的工具。

+0

所以說例如我使用'房間'和'Bunk'類(我已經遷移到數據庫),那些是我的域模型? 當生成控制器時,我將'Room'類設置爲我的模型,是否應該創建另一個類作爲我的域模型的包裝類型? –

+0

更詳細地更新了我的答案。這有幫助嗎? – levelnis

+0

這確實有幫助!雖然我有點困惑,如果我有一個'RoomViewModel'坐在中間,一個使用EF5的自動生成的控制器(創建索引,創建,細節,編輯,刪除)如何能夠將數據存儲到數據庫? –

3

這是一個用於綁定枚舉性別到您的看法。 假設學生是我綁定到視圖模型,

namespace MyApp.Models 
{ 
    public class Student 
    { 
      public int Id { get; set; } 
      public string FirstName { get; set; } 
      public string LastName { get; set; } 
      public Gender Gender { get; set; } 
    } 

    public enum Gender 
    { Male = 0, Female = 1 } 
} 

,然後在視圖

@Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(MyApp.Models.Gender)))) 

我希望你得到它吧!

+0

謝謝您的解釋,是否可以使用相同的'Student'類來附加'DbContext''DbSet'? –

+0

是的,你可以在你的DbContext類中有這個 –

+0

因爲這些枚舉將在多個地方使用,所以我應該真的在創建單獨的枚舉類文件呢? 這是否會影響他們與下降的觀點倒訪問的方法是什麼? 也做這個挑選出默認選擇性別? –

0

爲了獲得下拉列表數據到視圖,我建議將數據添加到ViewBag

你可以看到這樣一個在這裏例如: http://jnye.co/Posts/12/creating-cascading-dropdownlists-using-mvc-4-and-jquery

首先值添加到您的ViewBag。通常我把這個在它自己的方法,因爲它需要每個頁面加載時間(包括,在一個失敗的形式subission顯示時)被稱爲:

//You can keep your current list setup, I have simply shortened it for brevity 
var genderItems = new List<string> {"Unisex", "Female", "Male"}; 
ViewBag.Genders = new SelectList(genderItems); 

然後在您的視圖:

@Html.DropDownList("gender", ViewBag.Genders as SelectList) 

或者,如果你想要的結果綁定到一個屬性上您的視圖模型:

@Html.DropDownListFor(m => m.Property, ViewBag.Genders as SelectList) 
+0

爲什麼在OP已經使用視圖模型時使用ViewBag?你打算如何進行單元測試? – levelnis

+0

鑑於OP正在討論下拉列表,我認爲我們可以假設視圖模型用於定義去往和來自服務器的數據。下拉列表中的選項是視圖需要呈現的附加數據,並且不應在每次提交表單時將其發送回服務器,也不應將視圖模型更改爲適應此視圖數據,這是「ViewData」(其中'ViewBag'包裝)。'ViewBag'可以與視圖模型結合使用,所以OP已經使用視圖模型的事實不是問題,但實際上,我認爲是預期的。 – NinjaNye

+0

我不希望這會變成一個'ViewBag'和'ViewModel'辯論,因爲這已經完成了,但是dropdownlist選項不會每次都回發到服務器。只有選定的值被回傳。在特定於該視圖的'ViewModel'中封裝視圖所需的所有數據使得清楚哪些數據是必需的。爲了突出顯示所需的數據而不是回發,我喜歡用一個'ViewModel'來顯示,以及一個等效的'Command'來回傳給服務器。 'Command'不需要選項列表,只是選擇的值。 – levelnis

相關問題