2015-12-30 6 views
2

Привет Я довольно новичок в Asp.Net Mvc5, а также C#, и я надеюсь получить несколько указателей здесь, я пытался выяснить, почему я получаю следующую ошибку:Asp.net ViewModel return null

Элемент модели, переданный в словарь, имеет тип 'System.Data.Entity.DbSet 1[SoccerTeams.Models.Player]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [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; } 
    } 
} 

My 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. Однако после разговора с @Tony Bao, оспаривающим мое понимание, я заметил, что Viewmodel фактически возвращает поля, но с нулевыми значениями.

Любые руководства/учебные пособия, которые вы можете предложить, будут высоко оценены, поскольку я ищу не только решение, но и лучшее понимание того, почему это происходит и как правильно использовать ViewModel.

+0

Вы Infact посылая неправильную модель от контроллера. Ваш контроллер отправляет список игроков, пока ваше представление ожидает List . Отправка правильной модели из контроллера должна решить проблему –

+0

Я попытался сделать то, что вы сказали, но говорит, что TeamViewModel - это тип, который недопустим в данном контексте. Не могли бы вы привести пример? – L1ghtk3ira

+0

Я попробовал «return View (TeamViewModel)»; и ошибка выше - это то, что я получил. Я не думаю, что делаю это правильно. – L1ghtk3ira

ответ

3

Сначала добавьте 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); 
} 
+0

Игрок = новый Список (team.Players), это дает мне erros на Player и на PlayerModel – L1ghtk3ira

+0

Возможно, вы это заметили? Игроки = новый Список (team.Players) – L1ghtk3ira

+0

Да, заменить соответствующим типом. –

2

Вы можете просмотреть ДИСПЛЕЙ yFor Шаблоны в вашем сценарии. Есть тонны материалов на displaytemplates (для отображения) и editortempates (для вставки и обновления).вы можете найти на 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>