让我们说我有一个名为...... Person的表,我猜,它有列Name,Email,AgeGroupId。
AgeGroupId是一个int,它与表AgeGroup相关。 Agegroup只有两列:Id和AgeGroupName。
现在,在我的视图中,这是一个编辑“人物”的页面,我想要一个下拉框,其中包含每个AgeGroupName作为文本,以及Id作为值。 这样,稍后,我可以在我的年龄组表中添加一个新的“年龄组”,我的所有下拉框都会更新。或者有更好的方法我应该这样做吗?
我目前正在传递我的模型,并且这样做:
@ Html.DropDownListFor(model => model.AgeGroupId,@ agegroups)
并且在视图的顶部,我正在创建一个带有硬编码值的SelectList。我不希望他们硬编码,我不觉得?我会做什么而不是@agegroup来从AgeGroups表中获取列表?
感谢。
答案 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