获取多个选择列表并在MVC中显示它们的推荐方法是什么?

Sim*_*mon 8 c# asp.net-mvc asp.net-mvc-4

我已经搜索了SO和Google,但没有找到相关/可接受的答案.
背景:
*使用MVC 4.5
*我Repo<T>在EF5的顶部使用了一些Generic ,后者又通过泛型访问Service<T>
*我有域模型和视图模型,我使用Automapper在它们之间进行映射,这种映射发生在该Service
*最重要的是,我有我Controllers这又是通用尽可能.

那么,对于这个问题; 我有几个场景,我需要向用户提供一个选项列表,他们必须选择一个或多个.选项是特定于用户的,因此我的域中User有一个List<Location>是保存的位置,添加/修改时,Item需要选择至少一个Location.

我正在抵制List<Location>在我的控制器中获取它的诱惑,因为我想让它们保持通用和纤薄,但与此同时,我宁愿在我的ItemView模型中没有两个属性,一个用于AvailableLocations和一个用于SelectedLocations,因为使用了这个模型不只是添加/修改,而​​是搜索结果等.

选项:
*我应该引入一个不同的模型来添加/修改Item,例如ItemInput
*我应该使用一些自定义映射并获取Automapper来获取可用位置列表吗?
*我应该在哪一层获取这些可用位置?

人们对这个简洁而通用的方法提出了什么建议?
非常感谢!

Smi*_*thy 2

我会做这样的事情:

    public IEnumerable<Location> GetLocations() {
        return db.GetAll();
    }
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器内部(我从 MVC 脚手架中遵循了这一点):

 ViewBag.Locations = new SelectList(service.GetLocations, "name", "id");
Run Code Online (Sandbox Code Playgroud)

(或您自己的复选框列表)并将列表控件放在 HTML/视图页面上。

我认为这是最好的方法的原因是因为逻辑全部驻留在服务内部。如果您将其放入 DTO/数据模型中,您可能会遇到以下问题:

如果您需要额外的逻辑来撤回位置,会发生什么情况?即位置的子位置。

您更改服务(或覆盖)以反映新的更改,并且此逻辑将进入服务内部:

    public IEnumerable<Location> GetLocations(string parent) {
        return db.GetAll().Where(loc => loc.parentname = parent);
    }
Run Code Online (Sandbox Code Playgroud)

ps 我从不使用通用服务,我使用服务的原因是因为它提供的某些数据访问包含不适合通用 DAL 的逻辑。

我可以创建一个接口或抽象服务,以使服务之间的常见操作变得更容易,但是一旦您定义了一个具体的对象,UserManagementSerive您肯定会说您想要管理一个对象,该对象具有用户、位置和项目,每个对象都有其自己的特定功能?