2012-05-19 23 views
1

可以說,我有一個名爲...人,我猜,它有列名稱,電子郵件,AgeGroupId。從表格中獲取下拉值的正確方法是什麼?

AgeGroupId是一個int,它涉及表AgeGroup。 年齡組只有兩列:Id和AgeGroupName。

現在,在我看來,這是一個編輯「人物」的頁面,我想要一個下拉框,其每個AgeGroupName作爲文本,並將Id作爲值。 這樣,稍後我可以在我的年齡組表格中添加一個新的「年齡段」,我所有的下拉框都會更新。還是有更好的方法我應該這樣做?

目前我傳遞在我的模型,並且這樣做:

@ Html.DropDownListFor(型號=> model.AgeGroupId,@agegroups)

,並在視圖的頂部,我m使用硬編碼值創建SelectList。我不想讓他們硬編碼,我不認爲?我會做什麼而不是@agegroup從AgeGroups表中獲取列表?

謝謝。

+0

見我的教程[1]:http://www.asp.net/mvc/tutorials/javascript/working- dropdownlist-box-and-jquery /使用-dropdownlist-helper-with-aspnet-mvc [2]:http://blogs.msdn.com/b/rickandy/archive/2012/01/ 09/cascasding-dropdownlist-in-asp-net-mvc.aspx – RickAndMSFT

+0

@Kamyar,我還沒有標記爲已答覆,因爲雖然我得到它來填充下拉菜單,但我現在在更新數據庫時遇到了異常之前沒有得到)。我一直在嘗試調試自己,所以我可以學到最多,但如果我無法弄清楚,我會回覆。 然而,我做到了,upvote你。 – Kyle

回答

1

正確的方法是使用ViewModels。基本上你必須爲你的視圖創建一個視圖模型,而不是直接將db結果傳遞給你的視圖。喜歡的東西:

public class PersonViewModel 
{ 
    public Person Person {get ; set;} 
    public Dictionary<int, string> AgeGroups { get; set; } 
    public PersonViewModel() {} 
    public PersonViewModel(int personId) 
    { 
     var ctx = new Context(); 
     this.Person = ctx.Persons.SingleOrDefault(p => p.Id == personId); 
     foreach(var ageGroup in ctx.AgeGroups) 
     { 
      this.AgeGroups.Add(ageGroup.Id, ageGroup.AgeGroupName); 
     } 
    } 

那麼你的控制器方法是這樣的:

public ActionResult Add(PersonViewModel vm) 
{ 
    var ctx = new Context(); 
    if(ModelState.IsValid) 
    { 
     ctx.Persons.Add(vm.Person); 
     return View("Index"); 
    } 

    return View(vm); 
} 

而且在你看來,簡單地說:

@Html.DropDownListFor(model => model.Person.AgeGroupId, 
new SelectList(model.AgeGroups, "Id", "AgeGroupName")) 

當然,您的視圖模型現在PersonViewModel
更新
看起來像ASP.NET MVC 3工具更新默認添加下拉關係的關係。更多信息here

相關問題