2017-01-24 5 views
0

Я довольно новая для работы с ASP.NET MVC, и я в настоящее время пытаюсь решить проблему, я просто не могу получить мою голову вокруг:View возвращает нуль модель

Я пытаюсь загрузить currentArea из моей базы данных и создать объект CurrentArea из него, как это:

//My view ("PlayGame") 
@model SE2_S2P2_opdracht.Models.CurrentArea  

<html> 
<body>  
<div style="position:absolute; margin-top:8%; background-color:dimgrey; border:solid thin; border-color:darkgrey; width:59.45%; height:20%; opacity: 0.9"> 
@if (Model.area.GoNorth(Model.area.NorthMap)) 
     { 
      using (Html.BeginForm("NextArea", "Game", new { direction = "North" }, FormMethod.Post)) 
      { 

      <div style="position:absolute;top:8%; left:7%;"> 

       @Html.HiddenFor(m => m.area) 
       @Html.HiddenFor(m => m.player) 
       <input id="submit" type="submit" value="Go North" class="btn" /> 
      </div> 
      } 
     } 
</div>  
</body> 
</html> 

Так что, когда я нажимаю на кнопку Go North должно вызвать это:
(В итоге: он должен загрузить новую CurrentArea на основе просматриваемый токArea)

//My Controller ("GameController") 
    public ActionResult NextArea(CurrentArea currentarea, string direction) 
    { 

     if (direction == "North") 
     { 
      return View("PlayGame", currentarea = new CurrentArea(AreaRepo.GetByNorthMap(currentarea.area), currentarea.player)); 
     } 

После нажатия кнопки я получаю нулевую ссылку, говоря, что моя CurrentArea (переданная контроллеру) имеет значение NULL. Он, однако, читает мою строку направления.

Мой CurrentArea Класс лишь обертка

public class CurrentArea 
{ 
    public Area area { get; set; } 
    public Player player { get; set; } 
    public Enemy enemy { get; set; } 

    public CurrentArea() 
    { 

    } 

    public CurrentArea(Area area, Player player) 
    { 
     this.area = area; 
     this.player = player; 
    } 

Я удостоверился все необходимые свойства класса имели «{получить, набор;}» на них. (Те, которые я использую, по крайней мере, в необходимых конструкторах)

Я полагаю, что у меня отсутствует то, что может быть обнаружено более опытными программистами. (с помощью @ html.hiddenfor() я могу передать определенные объекты/объекты класса без их отображения, верно?)

+0

Вы видите, что на самом деле публикуется? –

+0

Отладчик показал, что все мои свойства «CurrentArea» возвращены как null. Однако проблема решена. :) –

ответ

1

@Html.HiddenFor оказывает ровно один <input type="hidden"/>.

Поэтому, если вы хотите опубликовать сложный объект, убедитесь, что вы отображаете скрытые поля для всех свойств этого объекта, которые должны быть отправлены обратно. Я не знаю, как ваш Area объект выглядит, но что-то вдоль этих линий:

@model CurrentArea 

@* post back the properties of CurrentArea.area we are interested in *@ 
@Html.HiddenFor(m => m.area.Name) 
@Html.HiddenFor(m => m.area.Id) 
@Html.HiddenFor(m => m.area.Coordinates.X) 

@* post back the properties of CurrentArea.player ... *@ 
@Html.HiddenFor(m => m.player.Name) 

Смотрите также Extend hiddenfor templates in asp net mvc.

+0

Это исправило проблему для меня. Думать об этом так же звучит очень логично в ретроспективе. Спасибо, что помогли мне! –

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