【发布时间】:2016-05-26 22:06:25
【问题描述】:
关于绑定下拉列表时 MVC 最佳实践的非常基本的问题。
这是一个真实世界的例子,但是一个解释我的问题的基本例子:
采取以下模型
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public virtual Car Car { get; set; }
}
public class Car
{
public int ID {get;set;}
public string Make {get; set;{}
public string Model {get; set;}
}
然后假设这些被展平成一个视图模型:
public class IndexViewModel
{
public int PersonID;
public string Name;
public int SelectedCarID;
public SelectList<Cars> Cars;
}
在我的构造函数中,我有一个索引方法:
[HttpGet]
public ActionResult Index()
{
var person = _ctx.People.FirstOrDefault(x=>x.ID == 1);
var vm = new IndexViewModel(){
Name = person.Name,
SelectedCarID = person.Car.ID,
};
return View(vm);
}
现在,假设从上下文返回的人在页面首次加载时没有汽车记录。 视图有一行:
@Html.DropDownListFor(m=>m.SelectedCarID, Model.Cars)
当表单被提交时,它被动作拾取:
[HttpPost]
public ActionResult Index(IndexViewModel model)
{
var person = _ctx.People.FirstOrDefault(x=>x.ID == model.PersonID);
var car = _ctx.Cars.FirstOrDefault(x=>x.ID == model.SelectedCarID);
person.Name = model.name;
person.Car = car;
_ctx.SaveChanges();
}
现在这就是我多年来一直这样做的方式,当 LINQ to SQL 起飞时,我开始使用 EF,并且我一直创建这样的模型,因为我认为这是推荐的方式。 今天与另一位开发人员讨论后,我不确定这是否仍然是最好的方法?一直让我很恼火的是,我需要对数据库进行查找以获取 Car 记录,以便我可以更新记录。
我的问题是:
- 实现上述目标的最佳方式是什么?
- 以上是否正确?
- 有没有更好的方法来更新汽车实体而不进行查找(最好不包括模型中的外键)?
- 只在模型中包含 FK 是否更好(这不是我一直在做的方式,它似乎更明智)?
- 有没有办法将下拉菜单绑定到汽车对象(我与之交谈的那个人似乎建议你可以,但我对 MVC/asp.net 的了解和疯狂的谷歌搜索似乎表明你不能)?
【问题讨论】:
-
与问题无关,但我想指出,在现实世界的应用程序中,上述某些应用程序将使用自动映射器,而我不会像这样在控制器中引用上下文 - 我一直是多年的开发人员 - 我确实(或多或少)知道我在做什么。有时质疑我们做事的方式并听取其他人的意见是件好事,这就是我在这里想要做的!我们在一个学习永远不会停止的职业中工作,在这种情况下,我非常感谢社区的投入。提前致谢。
标签: c# asp.net-mvc entity-framework model asp.net-mvc-5