从MVC3中的连接表生成清单

时间:2012-03-29 15:56:34

标签: asp.net-mvc entity-framework checkboxlist

我是一个从事MVC3项目的团队成员。我们都不是(还)MVC3专家,所以我甚至不确定如何正确地提出这个问题。我将不得不潜入并希望你对MVC经验丰富的人有意义。

我们有一个包含3个组成部分的HTML数据输入屏幕:左侧是一个大型滚动列表,中间是一个详细信息框,右侧是另一个滚动列表。左侧列表是从组表中提取的组代码和名称的列表。这是由名为_Groups的局部视图绘制的。中心区域显示当前所选组的详细信息字段。右侧列表是人名的滚动列表。中心和右侧都在名为_GroupDetails的局部视图中绘制。

右侧列表正是我们现在遇到的问题。我们有Groups表,Persons表和一个存储Group ID和Person ID的交叉表。如果一个人属于一个组,那么该人组对的交叉记录。如果没有,那就没有了。我们希望获取当前选定的组ID,并将其用于从Persons表中绘制所有记录的查询,并添加一个布尔字段。如果此人属于当前选定的组,则布尔字段应为T,否则为F.然后我们希望将其显示为一个清单,其中布尔字段为复选框字段,旁边是名称。

这样做的最佳方式是什么?

- Jon


其他信息,我希望这些信息很有用:我们这个视图的数据模型包括这个List定义:

  public List<GlobalName> UserList { get; set; }

是否可以为此列表编写一个包含查询或一系列查询的构造函数,最终得到包含我想要的元素的列表:复选框,用户名和用户ID(主键)如上所述设置复选框?

1 个答案:

答案 0 :(得分:0)

MVC没有像CheckList那样内置CheckBoxList帮助器方法。但是,有很多很好的扩展,所以你不需要重新发明轮子。您可以查看hereherehere以获取一些示例。

例如,使用MvcCheckBoxList扩展,您可以这样做:

// You'll need a view model
class GroupPersonsCheckListViewModel
{
    public IEnumerable<Person> Persons{ get; set; }
    public Group Group { get; set; }
}

// In your controller action:
var group = context.Group.Find(id); // assumes 'id' was passed to the action
var allPersons = context.Persons.OrderBy(person => person.Name);
var groupPersons = new GroupPersonsCheckListViewModel() { Persons = allPersons, Group = group };
return PartialView(groupPersons);

// In your partial
@Html.CheckBoxListFor("GroupPersons", 
    m => m.Persons,      // Collection of all persons
    p => p.PersonId,     // Person ID attribute
    p => p.Name,         // Person Name attribute
    m => m.Group.Persons // Collection of persons that are currently associated with the group
);