我通过docs
获取了一个数据列表,其中列出了当前登录用户可以访问的每个部门和功能。我需要在View页面上为DropDownList填充一个不同的Departments列表,为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")
答案 0 :(得分: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
应在您的视图中选择值。
答案 1 :(得分: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")
答案 2 :(得分:0)
您始终可以为视图创建ViewModel类,并将所有必要的视图信息放入其中。
您可以使用AutoMapper(https://github.com/AutoMapper/AutoMapper)这样的框架来帮助您在数据库模型和视图模型之间进行映射(我相信它是最好的,因为视图赢了并且不知道根本就是数据库模型,除了模型信息之外,您还可以添加这些列表(我做的是什么,我有实体的属性,以及这些列表的属性)。
如果您需要在许多视图中使用此信息,则可以始终创建BaseViewModel并在BaseController中规划该信息。