0

我获得了一个数据列表,docs其中包含当前登录用户可以访问的每个部门和功能的列表。我需要在视图页面上为 DropDownList 填充不同的部门列表和为 DropDownList 填充不同的函数列表。我目前什docs至没有使用它,而是使用不同的 LINQ 查询来实现这一点。有没有办法可以使用我正在传递的当前模型?

var docs = (Long LINQ query that joins in four different tables and returns a model)

ViewBag.DepartmentList = db.Department.Where(x => (x.name != null)).Select(s => new SelectListItem
            {
                Value = s.name,
                Text = s.name
            })
            .Distinct();  //  Fill the viewbag with a unique list of 'Department's from the table.

ViewBag.FunctionList = db.Function.Where(x => (x.name != null)).Select(s => new SelectListItem
            {
                Value = s.name,
                Text = s.name
            })
            .Distinct();  //  Fill the viewbag with a unique list of 'Function's from the table.

查看代码:(强类型模型)

@model IEnumerable<DB.Models.MasterList>

@Html.DropDownList("DepartmentList", "Select a Department")
@Html.DropDownList("FunctionList", "Select a Function")
4

3 回答 3

3

定义将在您的视图中使用的模型。

public class MyViewModel
{
    public string SelectedDepartment { get; set; }
    public string SelectedFunction   { get; set; }


    public IEnumerable<SelectListItem> Departments  { get; set; }
    public IEnumerable<SelectListItem> Functions    { get; set; }

    // Your old model
    public IEnumerable<MasterList> Master           { get; set;}

}

在您的控制器中,填充这些集合并将您的模型返回到视图。

[HttpGet]
public ActionResult ActionMethodName()
{
    var model = new MyViewModel();

    model.Departments = db.Departments.Where(x => (x.name != null))
                          .Select(s => new SelectListItem
                          {
                              Value = s.name,
                              Text = s.name
                          })
                          .Distinct(); 

    model.Functions = db.Functions.Where(x => (x.name != null))
                          .Select(s => new SelectListItem
                          {
                              Value = s.name,
                              Text = s.name
                          })
                          .Distinct(); 

    return View(model);
}

在您的视图中,使用强类型的 html 助手。

@model MyViewModel

@Html.DropDownListFor(m => m.SelectedDepartment, Model.Departments)
@Html.DropDownListFor(m => m.SelectedFunction, Model.Functions)

当您将表单回发到服务器时,SelectedDepartment应该SelectedFunction在您的视图中选择值。

于 2013-05-13T21:24:05.257 回答
1

您可以创建一个 ViewModel 并将所有这些数据放在这个 ViewModel 中:

视图模型

public class MyViewModel{
    public object DepartmentList{get; set;}
    public object FunctionList{get; set;}
    public IEnumerable<MasterList> Master {get; set;}
}

控制器

var docs = (Long LINQ query that joins in four different tables and returns a model)
MyViewModel vm = new MyViewModel();
vm.Master = docs; // I guess docs is a list of Masterlist
vm.DepartmentList = db.Department.Where(x => (x.name != null)).Select(s => new SelectListItem
            {
                Value = s.name,
                Text = s.name
            })
            .Distinct();  //  Fill the viewbag with a unique list of 'Department's from the table.

vm.FunctionList = db.Function.Where(x => (x.name != null)).Select(s => new SelectListItem
            {
                Value = s.name,
                Text = s.name
            })
            .Distinct();  //  Fill the viewbag with a unique list of 'Function's from the table.
return View(vm);

看法

@model MyViewModel

@Html.DropDownList("DepartmentList", "Select a Department")
@Html.DropDownList("FunctionList", "Select a Function")
于 2013-05-13T21:21:07.083 回答
0

您始终可以为您的视图创建一个 ViewModel 类,并将所有必要的视图信息放入其中。

您可以使用像 AutoMapper ( https://github.com/AutoMapper/AutoMapper ) 这样的框架来帮助您在数据库模型和视图模型之间进行映射(我相信视图最好不知道数据库模型在all),除了模型信息之外,您还可以添加这些列表(这就是我所做的,我有一个实体的属性,以及这些列表的属性)。

如果您在许多视图中都需要此信息,您始终可以创建一个 BaseViewModel 并将该信息填充到 BaseController 中。

于 2013-05-13T21:19:18.340 回答