【发布时间】:2017-11-19 13:47:21
【问题描述】:
尝试制作一个简单的应用程序,但在尝试使用视图模型时我的视图没有返回任何内容。我假设在域模型上应用时有效的“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; }
}
}
Street.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; }
}
}
FireExtinguisher.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
【问题讨论】:
-
我认为您没有为实体框架使用正确的约定。您正在更新
MyViewModel的构造函数中的所有内容,我认为您的结构没有创建正确的导航属性。但是,我已经有一段时间没有使用 EF 了。在您的控制器中,将此行分隔为一个变量,以便您可以中断它并查看它的值db.MyViewModels.ToList()(另外,您不需要 ToList() this) -
我试过了,但是没有 ToList() 就坏了。编辑了我的帖子,请查看更改
-
您可以通过在控制器中返回硬编码视图模型而不是调用数据库来帮助诊断您的问题是否与 EF 相关。只是为了测试,手动创建一些
MyViewModels,看看你的视图是否显示它们。 -
hc-ing 一些值有效,所以问题肯定在于查询数据库 - 但这并不奇怪,因为我从一开始就很确定数据选择有问题。我的问题更像是在使用视图模型时从 db 检索数据的正确 LINQ 语法是什么。
-
我就是这么想的。您更改或提出一个关注 EF 的新问题并消除所有 MVC 内容。我很确定您的课程不符合 EF 约定,但更专业的人可以更好地帮助您。
标签: c# asp.net asp.net-mvc entity-framework viewmodel