2015-05-31 6 views
-1

Я новичок в C# MVC, поэтому, пожалуйста, будьте терпеливы. У меня возникли проблемы с отображением вывода для ViewBag. Приложение является веб-страницей фэнтезийного футбола, поэтому у меня есть три таблицы (прямо сейчас, еще впереди), один для основной информации о игроке (dbo.Player), один для фона игрока (dbo.PlayerBackground), а один - это таблица определений для команда (dbo.Team).C# MVC Ошибка ViewBag

На одной из моих страниц у меня есть поиск по имени и поиск по положению и вы хотите вернуть информацию через эти три таблицы.

public ActionResult Index() 
{ 
    var players = (from p in db.Players 
        join pb in db.PlayerBackgrounds on p.playerId equals pb.playerID 
        join t in db.Teams on p.teamAbbre equals t.teamAbbre 
        select new { playerID = p.playerId, playerName = p.name, position = p.position, 
           height = pb.height, weight = pb.weight, college = pb.college, dob = pb.dob, 
           imageUrl = pb.imageUrl, years = pb.years, 
           teamName = t.name 
           }).ToList(); 

    ViewBag.data = players; 
    return View(); 
} 

Запрос работает нормально, но в index.cshtml Я продолжаю получать ошибки.

@foreach (var player in ViewBag.data) 
{ 
    <tr class="success ui-dragable playerRow" style="display: none;"> 
     <td> 
      <input type="checkbox" /> 
     </td> 
     <td> 
      @Html.ActionLink((string)player.playerName, "Details", new { id = player.playerID }, new { @class = "detailsLink" }) 
     </td> 
     <td> 
      @player.teamName 
     </td> 
     <td> 
      @player.position 
     </td>.... 

Из исследования, которое я сделал, похоже, что он должен работать. Я пробовал это как с, так и без (струнного) перевода. Без актерского это дает мне красной волнистой говорят, что я должен бросить и когда я делаю я получаю:

Сведения об исключении: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: «объект» не содержит определения для «Playername»

Как я могу пройти, я могу наблюдать за игроком, и он имеет различные свойства так, как должен. Любая идея, что я делаю неправильно?

ответ

1

Проблема в том, что вы используете анонимный объект. Я не могу взять на себя ответственность за это открытие, но ответ, который я нашел, был right here (Идите, дайте ему побороть). Обратитесь к нему за подробной информацией.

По существу, вкратце истории, что анонимные объекты испускаются как internal компилятором. Это вызывает проблемы при попытке использовать их как представления Razor, поскольку они скомпилированы в отдельную сборку по времени выполнения ASP.Net (internal разрешает доступ только в той же сборке).

Таким образом, решение состоит в определении вида модели:

public class PlayerViewModel 
{ 
    // Replace with the actual type of playerId 
    public int playerId { get; set; } 
    // etc... 
} 

И использовать его в контроллере:

public ActionResult Index() 
{ 
    var players = (from p in db.Players 
        join pb in db.PlayerBackgrounds on p.playerId equals pb.playerID 
        join t in db.Teams on p.teamAbbre equals t.teamAbbre 
        select new PlayerViewModel { playerID = p.playerId, ... }).ToList(); 

    return View(players); // Use the strongly-typed model property for your view 
          // instead of ViewBag.data (It's recommended) 
} 

И, наконец, на ваш взгляд:

@* At the beginning of your view *@ 
@model IEnumerable<PlayerViewModel> 
... 
@foreach (var player in @Model) 
    { 

     <tr class="success ui-dragable playerRow" style="display: none;"> 
      <td> 
       <input type="checkbox" /> 
      </td> 
      <td> 
       @Html.ActionLink(player.playerName, "Details", new { id = player.playerID }, new { @class = "detailsLink" }) 
      </td> 
      <td> 
       @player.teamName 
      </td> 
      <td> 
       @player.position 
      </td>.... 
+0

Благодарности Атину , Я тоже нашел этот пост, http://stackoverflow.com/questions/5207382/get-data-from-two-tablesjoin-with-linq-and-return-result-into-view, что очень помогло. Я изначально использовал viewmodel, но столкнулся с проблемами, которые заставили sql работать хорошо. Я до сих пор не понимаю, почему мой код не работал, потому что я точно следил за тем, что сделали другие плакаты. Хорошо, viewmodel - это путь. – nurdyguy

Смежные вопросы