从表中获取下拉列表值的正确方法是什么?

时间:2012-05-19 22:52:38

标签: asp.net-mvc entity-framework

让我们说我有一个名为...... Person的表,我猜,它有列Name,Email,AgeGroupId。

AgeGroupId是一个int,它与表AgeGroup相关。 Agegroup只有两列:Id和AgeGroupName。

现在,在我的视图中,这是一个编辑“人物”的页面,我想要一个下拉框,其中包含每个AgeGroupName作为文本,以及Id作为值。 这样,稍后,我可以在我的年龄组表中添加一个新的“年龄组”,我的所有下拉框都会更新。或者有更好的方法我应该这样做吗?

我目前正在传递我的模型,并且这样做:

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

并且在视图的顶部,我正在创建一个带有硬编码值的SelectList。我不希望他们硬编码,我不觉得?我会做什么而不是@agegroup来从AgeGroups表中获取列表?

感谢。

2 个答案:

答案 0 :(得分:1)

正确的方法是使用ViewModels。基本上,您必须为视图创建一个viewmodel,而不是直接将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 Tools更新默认情况下为关系添加了下拉列表。更多信息here

答案 1 :(得分:0)

正确的方式似乎来自Kamyars编辑,在msdn博客上: http://blogs.msdn.com/b/joecar/archive/2011/04/15/asp-net-mvc-3-tools-update.aspx