我有一个ASP.Net MVC应用程序,一些控制器操作有大约10个选择列表(其他有更多)。目前我的代码如下所示:
public ActionResult Edit(int carId)
{
CreateCar model = new CreateCar();
model.Makes = Helper.Makes();
model.Models = Helper.Models();
model.Colors = Helper.Colors();
model.EngineSizes = Helper.EngineSizes();
model.Materials = Helper.Materials();
model.FuelTypes = Helper.FuelTypes();
model.WheelSizes = Helper.WheelSizes();
model.BodyTypes = Helper.BodyTypes();
//more select lists below this
return View(model)
}
在我的观看中,我设置了这样的选择列表:
@Html.DropDownListFor(x => x, Model.Makes)
我的代码在许多操作中看起来像这样,我觉得有更好的方法可以做到这一点,所以我的行为不受这些选择列表的污染。
我能想到解决这个问题的唯一选择是在视图中调用Helper类,例如。
@Html.DropDownListFor(x => x, Helper.Makes())
这种做法是否被视为不良做法,是否还有其他方法可以解决这个问题?
答案 0 :(得分:1)
一般来说,是的,在你看来做这样的事情是不好的做法。控制器负责连接所有内容,因此您的代码应该去那里。现在,这很大程度上取决于你的Helper
班级正在做什么。如果选择列表只是通过一些代码生成的,那么在视图中可能并没有那么糟糕,但是你不想做的就是发出数据库查询而视图是被渲染。如果您的助手正在与数据库交互,请将其保存在控制器中。
那说,这里真正的问题是什么?当然有很多选择列表,但我不会说它已经污染了#34;"污染"你的行动。你做的很清楚。该操作负责为您的视图创建模型,以及它正在做什么。仅仅因为代码中可能包含很多行,并不一定意味着它的错误"或"错误"。
但是,如果您在很多地方重复此操作,我建议您将其分解为控制器上的私有或受保护方法。例如:
public ActionResult Edit(int carId)
{
...
PopulateSelectLists(model);
return View(model);
}
[HttpPost]
public ActionResult Edit(Foo model, int carId)
{
...
PopulateSelectLists(model);
return View(model);
}
private void PopulateSelectLists(Foo model)
{
model.Makes = Helper.Makes();
model.Models = Helper.Models();
model.Colors = Helper.Colors();
model.EngineSizes = Helper.EngineSizes();
model.Materials = Helper.Materials();
model.FuelTypes = Helper.FuelTypes();
model.WheelSizes = Helper.WheelSizes();
model.BodyTypes = Helper.BodyTypes();
//more select lists below this
}
然后,一切都干净整洁。