ASP.NET Core MVC中如何用单个控制器返回两个模型并绑定视图?
在ASP.NET Core MVC中返回多个模型并绑定视图的实现方法
方法一:使用强类型ViewModel(推荐)
这是MVC架构中最规范的实现方式,通过创建专门的视图模型类封装需要传递的多个数据集。
- 创建ViewModel类
在项目中新增ViewModel文件夹(或放在Models目录下),定义包含两个列表的视图模型:
public class ETIndexViewModel { public List<ET> ETList { get; set; } public List<ET> ETListOlmayanlar { get; set; } }
注:ET为你项目中对应的实体类,需确保引用正确。
- 修改控制器方法
将查询得到的两个列表赋值给ViewModel的属性,再将ViewModel传递给视图:
public IActionResult Index(string ilceler) { var viewModel = new ETIndexViewModel(); viewModel.ETList = c.ETs.Where(p => p.Ilce == ilceler && p.ETDurumu != "YOK") .OrderBy(p => p.KurumAdi) .ToList(); viewModel.ETListOlmayanlar = c.ETs.Where(p => p.Ilce == ilceler && p.ETDurumu == "YOK") .OrderBy(p => p.KurumAdi) .ToList(); return View(viewModel); }
- 视图绑定强类型模型
在对应的Index.cshtml视图开头指定模型类型,之后即可直接访问模型属性:
@model ETIndexViewModel <h3>ET Durumu Değil Olan Kurumlar</h3> <ul> @foreach (var item in Model.ETList) { <li>@item.KurumAdi</li> } </ul> <h3>ET Durumu YOK Olan Kurumlar</h3> <ul> @foreach (var item in Model.ETListOlmayanlar) { <li>@item.KurumAdi</li> } </ul>
方法二:使用ViewBag/ViewData(快速临时方案)
如果不想创建ViewModel,可通过ViewBag或ViewData传递数据,适合简单场景:
- 控制器中赋值
- 使用ViewBag:
public IActionResult Index(string ilceler) { ViewBag.ETList = c.ETs.Where(p => p.Ilce == ilceler && p.ETDurumu != "YOK") .OrderBy(p => p.KurumAdi) .ToList(); ViewBag.ETListOlmayanlar = c.ETs.Where(p => p.Ilce == ilceler && p.ETDurumu == "YOK") .OrderBy(p => p.KurumAdi) .ToList(); return View(); }
- 使用ViewData:
public IActionResult Index(string ilceler) { ViewData["ETList"] = c.ETs.Where(p => p.Ilce == ilceler && p.ETDurumu != "YOK") .OrderBy(p => p.KurumAdi) .ToList(); ViewData["ETListOlmayanlar"] = c.ETs.Where(p => p.Ilce == ilceler && p.ETDurumu == "YOK") .OrderBy(p => p.KurumAdi) .ToList(); return View(); }
- 视图中访问数据
- ViewBag需做类型转换:
<h3>ET Durumu Değil Olan Kurumlar</h3> <ul> @foreach (var item in ViewBag.ETList as List<ET>) { <li>@item.KurumAdi</li> } </ul>
- ViewData需显式强制转换:
<h3>ET Durumu YOK Olan Kurumlar</h3> <ul> @foreach (var item in (List<ET>)ViewData["ETListOlmayanlar"]) { <li>@item.KurumAdi</li> } </ul>
方法三:使用ValueTuple(C# 7.0+支持)
可直接返回ValueTuple给视图,无需额外创建类:
- 控制器方法修改
public IActionResult Index(string ilceler) { var ETList = c.ETs.Where(p => p.Ilce == ilceler && p.ETDurumu != "YOK") .OrderBy(p => p.KurumAdi) .ToList(); var ETListOlmayanlar = c.ETs.Where(p => p.Ilce == ilceler && p.ETDurumu == "YOK") .OrderBy(p => p.KurumAdi) .ToList(); return View((ETList, ETListOlmayanlar)); }
- 视图中绑定访问
@model (List<ET> ETList, List<ET> ETListOlmayanlar) <h3>ET Durumu Değil Olan Kurumlar</h3> <ul> @foreach (var item in Model.ETList) { <li>@item.KurumAdi</li> } </ul> <h3>ET Durumu YOK Olan Kurumlar</h3> <ul> @foreach (var item in Model.ETListOlmayanlar) { <li>@item.KurumAdi</li> } </ul>
内容的提问来源于stack exchange,提问作者Ahmet Demir
相关产品推荐
相关产品推荐

