试图制作一个简单的应用程序,但在尝试使用视图模型时,我的视图没有返回任何结果。我认为"db.[TableName].ToList();"在应用于域模型时是不够的,并且在使用视图模型时应该以不同的方式进行选择,但我不知道如何做到这一点。请提供帮助。非常感谢。
Town.cs
using System.Collections.Generic;
namespace City.Models
{
public class Town
{
public Town()
{
Streets = new List<Street>();
}
public int TownId { get; set; }
public string TownName { get; set; }
public virtual ICollection<Street> Streets { get; set; }
}
}
街道.cs
using System.Collections.Generic;
namespace City.Models
{
public class Street
{
public Street()
{
Houses = new List<House>();
}
public int StreetId { get; set; }
public string StreetName { get; set; }
public virtual ICollection<House> Houses { get; set; }
}
}
House.cs
namespace City.Models
{
public class House
{
public int HouseId { get; set; }
public string HoueseName { get; set; }
public int StreetId { get; set; }
public virtual Street Street { get; set; }
}
}
Floor.cs
namespace City.Models
{
public class Floor
{
public int FloorId { get; set; }
public int FloorNumber { get; set; }
public int FireExtinguisherId { get; set; }
}
}
灭火器.cs
namespace City.Models
{
public class FireExtinguisher
{
public int FireExtinguisherId { get; set; }
public string FireExtinguisherName { get; set; }
public int FloorId { get; set; }
}
}
MyViewModel.cs
namespace City.Models
{
public class MyViewModel
{
public MyViewModel()
{
Town = new Town();
Street = new Street();
House = new House();
Floor = new Floor();
FireExtinguisher = new FireExtinguisher();
}
public int MyViewModelId { get; set; }
public Town Town { get; set; }
public Street Street { get; set; }
public House House { get; set; }
public Floor Floor { get; set; }
public FireExtinguisher FireExtinguisher { get; set; }
}
}
ApplicationDbContext.cs
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Town> Towns { get; set; }
public DbSet<Street> Streets { get; set; }
public DbSet<House> Houses { get; set; }
public DbSet<Floor> Floors { get; set; }
public DbSet<FireExtinguisher> FireExtinguishers { get; set; }
public DbSet<MyViewModel> MyViewModels { get; set; }
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
HomeController.cs(我认为问题出在这里)
using System.Linq;
using System.Web.Mvc;
using City.Models;
namespace City.Controllers
{
public class HomeController : Controller
{
private ApplicationDbContext db;
public HomeController()
{
db = new ApplicationDbContext();
}
public ActionResult Index()
{
return View(db.MyViewModels.ToList());
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
}
Index.cshtml
@model IEnumerable<City.Models.MyViewModel>
<h2>Map information</h2>
<div class="container">
<table class="table">
<thead>
<tr>
<th>Town</th>
<th>Street</th>
<th>House</th>
<th>Floor</th>
<th>FireExtinguisher</th>
</tr>
</thead>
@foreach (var item in Model)
{
<tbody>
<tr>
<td>@(item.Town.TownName)</td>
<td>@(item.Street.StreetName)</td>
<td>@(item.House.HoueseName)</td>
<td>@(item.Floor.FloorNumber)</td>
<td>@(item.FireExtinguisher.FireExtinguisherName)</td>
</tr>
</tbody>
}
</table>
</div>
尽管我在数据库中有测试数据,但这就是我运行它时看到的全部内容:
图像在这里
请告诉我应该修复什么,如何检索数据。感谢
编辑@CrowdCoder
此处为新图片
我认为您对视图模型的理解是错误的。
视图模型是在视图和操作方法之间传输数据的类视图模型特定于视图。因此,如果视图只需要显示两个属性(Name
和Age
),则视图模型将只显示这两个属性。不需要将实体模型中的所有属性都带到视图模型类中。
我看到您在数据库上下文中添加了一个新集合
public DbSet<MyViewModel> MyViewModels { get; set; }
这毫无道理。正如我前面提到的,视图模型是UI问题。它不应该出现在您的数据访问代码中。也不要在视图模型中混合ORM图层创建的实体。
视图模型也是简单的POCO。它应该是具有属性的精简平面类。您有责任加载属性值。您可以在您的动作方法或从动作方法调用的另一个方法中执行此操作。
假设你想显示一个带有街道名称的房屋列表,你会创建一个像这样的视图模型
public class HouseViewModel
{
public int HouseId { set; get;}
public string HoueseName { set;get;}
public string StreetName { set;get; }
}
现在在您看来,您只需访问这些属性
@model IEnumerable<HouseViewModel>
<table>
@foreach(var item in Model)
{
<tr>
<td>@item.HouseId </td>
<td>@item.HoueseName </td>
<td>@item.StreetName </td>
</tr>
}
</table>
当然,要使此代码正常工作,您需要确保将创建一个HouseViewModel
列表,并将其从操作方法发送到视图。
public ActionResult Index()
{
var list= new List<HouseViewModel>{
new HouseViewModel { HouseId =1,HoueseName ="Abc", StreetName ="Detroit"},
new HouseViewModel { HouseId =2,HoueseName ="Xyz", StreetName ="Novi"}
};
return View(list);
}
现在您可以看到我们是如何使用视图模型将数据从操作方法传输到视图的。在这里,我们只是对正在发送的列表中的项目的属性值进行了硬编码。我们可以根据需要更新它以读取您的EF数据库上下文。
让我们阅读所有的Houses,使用LINQ投影为该集合中的每个项目创建一个HouseViewModel
对象,并分配属性值。
public ActionResult Index()
{
var houses = db.Houses
.Select(a=>new HouseViewModel
{ HouseId =a.HouseId,
HoueseName =a.HouseName,
StreetName = a.Street.StreetName
})
.ToList();
return View(houses);
}