【问题标题】:Asp.net ViewModel returning nullAsp.net ViewModel 返回 null
【发布时间】:2015-12-30 04:25:27
【问题描述】:

我对 Asp.Net Mvc5 和 c# 还很陌生,我希望在这里获得一些指导,我一直在试图找出为什么会出现以下错误:

传入字典的模型项的类型为“System.Data.Entity.DbSet1[SoccerTeams.Models.Player]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[SoccerTeams.Models.ViewModels.TeamViewModel]”。

然而,在调试之后,我意识到 ViewModel 对象实际上为所有项目返回了空值。我创建了一个页面,可以正常添加团队以及该团队的球员。在我的数据库中,球队有一个表格,所有球员都在另一个表格中,每个球员都有球队名称(球员和球队名称在两个单独的列中),因此它可以与正确的球队相关联。我创建了一个 ViewModel,我正在尝试调用该 ViewModel 并能够将所有玩家返回到视图中,以便我可以在列表中显示它们。

“查看所有玩家视图”的我的团队控制器如下:

 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&lt;SoccerTeams.Models.ViewModels.TeamViewModel&gt; 有关。然而,在与 @Tony Bao 交谈后挑战了我的理解,我注意到 Viewmodel 实际上返回的字段是空值。

我也在寻找任何指南或教程,因为我不仅在寻找解决方案,而且还想更好地理解为什么会发生这种情况以及如何正确使用 ViewModel。

【问题讨论】:

  • 您实际上是从控制器发送了错误的模型。您的控制器发送玩家列表,而您的视图需要 List。从控制器发送正确的模型应该可以解决问题
  • 我试着按照你说的去做,但是它说 TeamViewModel 是一种类型,在给定的上下文中是无效的。可以举个例子吗?
  • 我试过“返回视图(TeamViewModel);”上面的错误就是我得到的。我认为我做得不对。
  • 如果你想为一支球队返回球员,那么返回View(model); @model SoccerTeams.Models.ViewModels.TeamViewModel (var item in Model.Players) @Html.DisplayFor(modelItem => item.Name) ForEach 应该是球员循环。
  • 我想要每支球队的所有球员

标签: c# asp.net-mvc razor viewmodel


【解决方案1】:

首先将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);
}

【讨论】:

  • Player = new List(team.Players),这给了我在 Player 和 PlayerModel 上的错误
  • 也许你提到了这个? Players = new List(team.Players)
  • 我在 == id 上也有错误。 ID 在表中,因此我不明白为什么它说它在当前上下文中不存在。除非我可能需要删除旧数据库
  • 它说它不是上下文的一部分。除了球员,一切都被带来了。我认为没有通过正确的 id。
【解决方案2】:

您可以在您的场景中查看 DisplayFor 模板。 displaytemplates(用于显示)和editortempates(用于插入和更新)上有大量材料。你可以在谷歌上搜索

这是我的建议

     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

播放器.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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2015-01-27
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多