Asp.net ViewModel 返回 null
Asp.net ViewModel returning null
我是 Asp.Net Mvc5 和 c# 的新手,我希望能在这里获得一些指导,我一直在努力弄清楚为什么会出现以下错误:
传入字典的模型项的类型为'System.Data.Entity.DbSet1[SoccerTeams.Models.Player]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable
1[SoccerTeams.Models.ViewModels.TeamViewModel]'。
但是现在在调试之后我意识到 ViewModel 对象实际上是 returning 所有项目的空值。我创建了一个页面,该页面可以正常工作以添加团队以及该团队的球员。在我的数据库中,球队有一个 table,所有球员都在另一个 table 中,每个球员都有球队名称(球员和球队名称在两个单独的列中),因此它可以与正确的团队。我已经创建了一个 ViewModel,我正在尝试调用该 ViewModel 并能够 return 所有玩家进入视图,以便我可以在列表中显示他们。
我的 "View all players view" 团队控制器如下:
public ActionResult ViewAllPlayers()
{
TeamViewModel teamView = new TeamViewModel();
return View(teamView);
}
我的团队模型如下:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SoccerTeams.Models
{
// This teams class will be used to represent the teams in the database
public class Team
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string TeamName { get; set; }
public string Coach { get; set; }
public string Conference { get; set; }
}
}
我的播放器模型如下:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SoccerTeams.Models
{
public class Player
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public Guid TeamId { get; set; }
public string Name { get; set; }
}
}
我的ViewModel如下:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SoccerTeams.Models.ViewModels
{
public class TeamViewModel
{
public string TeamName { get; set; }
public string Coach { get; set; }
public string Conference { get; set; }
public List<Player> Players { get; set; }
}
}
我的CreateTeam操作如下:
public async Task<ActionResult> Create(TeamViewModel model, string addfiverows)
{
if (ModelState.IsValid)
{
if (!string.IsNullOrEmpty(addfiverows)) return View(model);
var team = new Team { TeamName = model.TeamName, Coach = model.Coach, Conference = model.Conference };
db.Teams.Add(team);
var result = await db.SaveChangesAsync();
if(result > 0)
{
foreach(var player in model.Players)
{
var p = new Player { Name = player.Name, Id = team.Id };
db.Players.Add(p);
}
result = await db.SaveChangesAsync();
}
if(result > 0) return RedirectToAction("Index");
}
return View();
}
我尝试显示的视图如下:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@model SoccerTeams.Models.ViewModels.TeamViewModel
@{
ViewBag.Title = "View All Players";
}
<h2>View All Players</h2>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.TeamName)
</th>
<th>
@Html.DisplayNameFor(model => model.Players)
</th>
<th></th>
</tr>
@foreach (var item in Model.Players)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.TeamName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Players)
</td>
</tr>
}
</table>
通过研究,我认为问题与@model IEnumerable<SoccerTeams.Models.ViewModels.TeamViewModel>
有关。然而,在与@Tony Bao 讨论挑战我的理解之后,我注意到 Viewmodel 实际上是 returning 字段但是具有空值。
我也在寻找任何指南或教程,因为我不仅在寻找解决方案,而且还想更好地理解为什么会发生这种情况以及如何正确使用 ViewModel。
首先将Player
集合添加到Team
模型:
public class Team
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string TeamName { get; set; }
public string Coach { get; set; }
public string Conference { get; set; }
public virtual ICollection<Player> Players { get; set; }
}
并在 Player
模型中添加 Team
:
public class Player
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string Name { get; set; }
public Guid TeamId { get; set; }
public virtual Team Team {get; set;}
}
并在 ViewAllPlayers
操作中:
public ActionResult ViewAllPlayers(Guid id)
{
var team = db.Teams.Include(t => t.Players).Single(t => t.Id == id);
TeamViewModel teamView = new TeamViewModel
{
TeamName = team.TeamName,
Coach = team.Coach,
Conference = team.Conference,
Player = new List<Player>(team.Players)
};
return View(teamView);
}
您可以在您的场景中查看 DisplayFor Templates。显示模板(用于显示)和编辑器模板(用于插入和更新)有大量材料。您可以在 google
上搜索
这是我的建议
public ActionResult ViewAllPlayers()
{
//this should be from your database
var teamviewer = new TeamViewModel();
teamviewer.TeamName = "t1";
teamviewer.Players = new List<Player>() { new Player { PlayerName = "p1" }, new Player { PlayerName = "p2" } };
return View();
}
您的视图模型
public class TeamViewModel
{
public string TeamName { get; set; }
public string Coach { get; set; }
public string Conference { get; set; }
public List<Player> Players { get; set; }
}
public class Player
{
public string PlayerName { get; set; }
}
在此处创建一个 Displayfor 模板
Views/Shared/DisplayTemplates/Player.cshtml
Player.cshtml
@model SoccerTeams.Models.Player
@Html.DisplayFor(m=>m.PlayerName)
在您的索引页上
@model SoccerTeams.Models.TeamViewModel
<h2>View All Players</h2>
<table class="table">
<tr>
<td>
@Html.DisplayFor(modelItem => modelItem.TeamName)
</td>
<td>
@Html.DisplayFor(modelItem=>modelItem.Players)
</td>
</tr>
</table>
我是 Asp.Net Mvc5 和 c# 的新手,我希望能在这里获得一些指导,我一直在努力弄清楚为什么会出现以下错误:
传入字典的模型项的类型为'System.Data.Entity.DbSet1[SoccerTeams.Models.Player]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable
1[SoccerTeams.Models.ViewModels.TeamViewModel]'。
但是现在在调试之后我意识到 ViewModel 对象实际上是 returning 所有项目的空值。我创建了一个页面,该页面可以正常工作以添加团队以及该团队的球员。在我的数据库中,球队有一个 table,所有球员都在另一个 table 中,每个球员都有球队名称(球员和球队名称在两个单独的列中),因此它可以与正确的团队。我已经创建了一个 ViewModel,我正在尝试调用该 ViewModel 并能够 return 所有玩家进入视图,以便我可以在列表中显示他们。
我的 "View all players view" 团队控制器如下:
public ActionResult ViewAllPlayers()
{
TeamViewModel teamView = new TeamViewModel();
return View(teamView);
}
我的团队模型如下:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SoccerTeams.Models
{
// This teams class will be used to represent the teams in the database
public class Team
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string TeamName { get; set; }
public string Coach { get; set; }
public string Conference { get; set; }
}
}
我的播放器模型如下:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SoccerTeams.Models
{
public class Player
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public Guid TeamId { get; set; }
public string Name { get; set; }
}
}
我的ViewModel如下:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SoccerTeams.Models.ViewModels
{
public class TeamViewModel
{
public string TeamName { get; set; }
public string Coach { get; set; }
public string Conference { get; set; }
public List<Player> Players { get; set; }
}
}
我的CreateTeam操作如下:
public async Task<ActionResult> Create(TeamViewModel model, string addfiverows)
{
if (ModelState.IsValid)
{
if (!string.IsNullOrEmpty(addfiverows)) return View(model);
var team = new Team { TeamName = model.TeamName, Coach = model.Coach, Conference = model.Conference };
db.Teams.Add(team);
var result = await db.SaveChangesAsync();
if(result > 0)
{
foreach(var player in model.Players)
{
var p = new Player { Name = player.Name, Id = team.Id };
db.Players.Add(p);
}
result = await db.SaveChangesAsync();
}
if(result > 0) return RedirectToAction("Index");
}
return View();
}
我尝试显示的视图如下:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@model SoccerTeams.Models.ViewModels.TeamViewModel
@{
ViewBag.Title = "View All Players";
}
<h2>View All Players</h2>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.TeamName)
</th>
<th>
@Html.DisplayNameFor(model => model.Players)
</th>
<th></th>
</tr>
@foreach (var item in Model.Players)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.TeamName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Players)
</td>
</tr>
}
</table>
通过研究,我认为问题与@model IEnumerable<SoccerTeams.Models.ViewModels.TeamViewModel>
有关。然而,在与@Tony Bao 讨论挑战我的理解之后,我注意到 Viewmodel 实际上是 returning 字段但是具有空值。
我也在寻找任何指南或教程,因为我不仅在寻找解决方案,而且还想更好地理解为什么会发生这种情况以及如何正确使用 ViewModel。
首先将Player
集合添加到Team
模型:
public class Team
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string TeamName { get; set; }
public string Coach { get; set; }
public string Conference { get; set; }
public virtual ICollection<Player> Players { get; set; }
}
并在 Player
模型中添加 Team
:
public class Player
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string Name { get; set; }
public Guid TeamId { get; set; }
public virtual Team Team {get; set;}
}
并在 ViewAllPlayers
操作中:
public ActionResult ViewAllPlayers(Guid id)
{
var team = db.Teams.Include(t => t.Players).Single(t => t.Id == id);
TeamViewModel teamView = new TeamViewModel
{
TeamName = team.TeamName,
Coach = team.Coach,
Conference = team.Conference,
Player = new List<Player>(team.Players)
};
return View(teamView);
}
您可以在您的场景中查看 DisplayFor Templates。显示模板(用于显示)和编辑器模板(用于插入和更新)有大量材料。您可以在 google
上搜索这是我的建议
public ActionResult ViewAllPlayers()
{
//this should be from your database
var teamviewer = new TeamViewModel();
teamviewer.TeamName = "t1";
teamviewer.Players = new List<Player>() { new Player { PlayerName = "p1" }, new Player { PlayerName = "p2" } };
return View();
}
您的视图模型
public class TeamViewModel
{
public string TeamName { get; set; }
public string Coach { get; set; }
public string Conference { get; set; }
public List<Player> Players { get; set; }
}
public class Player
{
public string PlayerName { get; set; }
}
在此处创建一个 Displayfor 模板
Views/Shared/DisplayTemplates/Player.cshtml
Player.cshtml
@model SoccerTeams.Models.Player
@Html.DisplayFor(m=>m.PlayerName)
在您的索引页上
@model SoccerTeams.Models.TeamViewModel
<h2>View All Players</h2>
<table class="table">
<tr>
<td>
@Html.DisplayFor(modelItem => modelItem.TeamName)
</td>
<td>
@Html.DisplayFor(modelItem=>modelItem.Players)
</td>
</tr>
</table>