比使用ViewBag更好的方法

时间:2013-05-13 21:12:37

标签: c# asp.net-mvc linq

我通过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")

3 个答案:

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

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

答案 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中规划该信息。