1

假设我有一个名为... Person 的表,我猜它包含 Name、Email、AgeGroupId 列。

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

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

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

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

在视图的顶部,我正在制作一个带有硬编码值的 SelectList。我不希望他们硬编码,我不认为?我会做什么而不是 @agegroup 从 AgeGroups 表中获取列表?

谢谢。

4

2 回答 2

1

正确的方法是使用 ViewModels。基本上,您必须为您的视图创建一个视图模型,而不是将数据库结果直接传递给您的视图。就像是:

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 工具更新默认为关系添加下拉菜单。更多信息在这里

于 2012-05-19T23:04:56.980 回答
0

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

于 2012-05-30T20:42:20.810 回答