选择列表太多会污染我的控制器操作

时间:2016-04-08 11:39:22

标签: asp.net asp.net-mvc select refactoring

我有一个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())

这种做法是否被视为不良做法,是否还有其他方法可以解决这个问题?

1 个答案:

答案 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
}

然后,一切都干净整洁。