在当前视图中添加Viewbag

时间:2019-07-01 21:24:08

标签: asp.net-mvc

我正在尝试查看是否可以添加ViewBag,以将另一个数据库结果添加到我已有的视图列表中。下面是我要在控制器和视图中尝试执行的操作:这是正确的方法吗?

Controller.cs:

    public ActionResult Branch(string Branch)
    {
        ViewBag.BranchName = Branch;
        var result = from c in db.Branches select c;
        ViewBag.Data1 = result;

        var employees = from m in db.Employees
                where m.Branch == Branch || Branch == null || Branch == "" select m;

        return View(employees.ToList());

    }

View.cshtml:

    ...

    @foreach (var item in ViewBag.Data1 as IEnumerable<Test.Models.Employee>)
    {
        @Html.DisplayFor(modelItem => item.name);
    }

    ...

1 个答案:

答案 0 :(得分:0)

您当然可以将Linq查询的结果存储在ViewBag变量中,并以与其他任何情况下相同的方式使用它。

您可能会碰到所提供的代码的唯一障碍是编译器可能不理解Employee类(或者根据您的代码示例,您的意思是Branch?)。

要解决此问题,您可以选择以下几种方法:

  • 更新Views目录中的Web.Config文件,以便在编译所有视图时使用Test.Models名称空间:

    Views / Web.Config:

    <system.web.webPages.razor>
        <pages ...>
            <namespaces>
                ...
                <add namespace="Test.Models" />
                ...
            </namespaces>
        </pages>
    </system.web.webPages.razor>
    
  • 在需要使用命名空间的视图顶部添加@using Test.Models

  • 通过在视图模型类中强烈键入视图并将您需要从该视图访问的所有内容放在视图模型中,完全忘记ViewBag

    ViewModel.cs(新):

    using Test.Models;
    
    namespace Test.ViewModels
    {
        public class BranchViewModel
        {
            public string BranchName { get; set; }
    
            List<Employee> Employees { get; set; }
    
            List<Branch> Branches { get; set; }
        }
    }
    

    Controller.cs(已更新):

    using Test.ViewModels;
    using Test.Models;
    
    ...
    
    public ActionResult Branch(string Branch)
    {
       IEnumerable<Employee> employees = from m in db.Employees
                                         where m.Branch == Branch || Branch == null || Branch == ""
                                         select m;
       IEnumerable<Branches> branches = from c in db.Branches
                                        select c;
    
    
        var viewModel = new BranchViewModel()
        {
            BranchName = Branch,
            Employees = employees.ToList(),
            Branches = branches.ToList()
        };
    
        return View(viewModel);
    
    }
    

    View.cshtml(已更新):

    @model Test.ViewModels.BranchViewModel
    
    ...
    
    @foreach (var branch in Model.Branches)
    {
        @Html.Display(branch.name)
    }
    
    ...