ASP.NET MVC Viewmodel不返回任何内容

时间:2017-11-19 13:47:21

标签: c# asp.net asp.net-mvc entity-framework viewmodel

尝试创建一个简单的应用程序,但在尝试使用viewmodel时,我的视图没有返回任何内容。我假设" 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>

即使我在数据库中有测试数据,这就是我在运行时看到的所有内容:

Image is here

请告诉我应该修复什么,如何获取数据。感谢

编辑@CrowdCoder

new picture here

1 个答案:

答案 0 :(得分:1)

我认为您对视图模型的理解不正确。

View model是一个在视图和操作方法之间传输数据的类。 查看模型特定于视图。因此,如果您的视图只需显示2个属性( public Nodes Parse(string[] Str) { Nodes res = graphClient.Cypher.OptionalMatch("(a)-[]->(b)") .Where((Vertex a) => a.Name == Parallel.ForEach<string>(Str, (s) => return s)) //NOT WORK! return is illegal .Return((a, b) => new Nodes { Source = a.As<Vertex>(), Peers = b.CollectAs<Vertex>().ToList() }) .Results.FirstOrDefault(); return res; } Name),那么您的视图模型将只包含这2个属性。无需将实体模型中的所有属性都带到视图模型类。

我看到您在数据库上下文中添加了一个新集合,

Age

这没有任何意义。正如我之前提到的,视图模型是UI关注点。它不应该在您的数据访问代码中。也不要在视图模型中混合ORM图层创建的实体。

此外,查看模型是简单的POCO。它应该是具有属性的精益平面类。您有责任加载属性值。您可以在操作方法或从操作方法调用的其他方法中执行此操作。

假设您要显示带有街道名称的房屋列表,您将创建一个这样的视图模型

public DbSet<MyViewModel> MyViewModels { get; set; }

现在在您看来,您只需访问这些属性

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

现在您可以看到我们如何使用视图模型将数据从操作方法传输到视图。这里我们只是对我们发送的列表中的项的属性值进行了硬编码。我们可以根据需要更新它以从您的EF db上下文中读取。

让我们阅读所有的房子,使用LINQ投影为该集合中的每个项目创建一个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); } 对象并分配属性值。

HouseViewModel