2014-08-27 6 views
0

StudentModel.Checkboxlist - on Post: Create - NullReferenceException

namespace mvcApp.Models 
{ 
    public class StudentModel 
    { 
     [Display(Name = "First Name")] 
     public string FirstName { get; set; } 
     [Display(Name = "Last Name")] 
     public string LastName { get; set; } 
     [Display(Name = "Email Address")] 
     public string EmailAddress { get; set; } 

     public List<SchoolOrganization> Organizations { get; set; } 
    } 

    public class SchoolOrganization 
    { 
     public string Name { get; set; } 
     public bool IsInvolved { get; set; } 
    } 
} 

Студент участвует в нескольких организациях.

Контроллер

namespace mvcApp.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

      return View(); 
     } 


     public ActionResult StudentInformation() 
     { 
      // populate student with data 
      var student = new StudentModel() { FirstName = "Joe", LastName = "Doe", EmailAddress = "[email protected]"}; 

      // Populate with Organizations 
      student.Organizations = new List<SchoolOrganization>(); 

      student.Organizations.Add(new SchoolOrganization() { Name = "Math Club", IsInvolved = true}); 
      student.Organizations.Add(new SchoolOrganization() { Name = "Chess Club", IsInvolved = false }); 
      student.Organizations.Add(new SchoolOrganization() { Name = "Football", IsInvolved = true }); 

      return View(student); 
     } 

     **[HttpPost] 
     public ActionResult StudentInformation(StudentModel student) 
     { 
      Response.Write("Name: " + student.FirstName); 

      foreach (var o in student.Organizations) 
      { 
       Response.Write(o.Name + " : " + o.IsInvolved.ToString()); 
      } 
      return View(); 
     }** 
    } 
} 

данные будут в конечном счете заполняется из базы данных.

Посмотреть

@model mvcApp.Models.StudentModel 

@{ 
    ViewBag.Title = "StudentInformation"; 
} 

<h2>StudentInformation</h2> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>StudentModel</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.FirstName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.FirstName) 
      @Html.ValidationMessageFor(model => model.FirstName) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.LastName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.LastName) 
      @Html.ValidationMessageFor(model => model.LastName) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.EmailAddress) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.EmailAddress) 
      @Html.ValidationMessageFor(model => model.EmailAddress) 
     </div> 

     <div> 
      <table> 
        <tr> 

         <td>Organization Name</td><td>Is Involved</td> 
        </tr> 
       @for (int i = 0; i < Model.Organizations.Count; i++) <== System.NullReferenceException here 
       { 
        @Html.HiddenFor(m => m.Organizations[i].IsInvolved) 
        <tr> 
         <td>@Html.DisplayFor(m => m.Organizations[i].Name)</td> 
         <td>@Html.CheckBoxFor(m => m.Organizations[i].IsInvolved)</td> 
        </tr> 
       } 
      </table> 

     </div> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 

Приведенный выше код отображается в порядке с HttGet. Однако, когда я пытаюсь обновить, я получаю System.NullReferenceException. https://www.dropbox.com/s/dz0bg3hkd0yq8e3/studentInformation.png?dl=0

Может кто-нибудь может помочь понять, что происходит?

спасибо.

ответ

0

В приведенном вами образце кода; функция ActionCesult для HomeStringer для HttpPost для StudentInformation не создает и не передает новый экземпляр обновленной объектной модели в представление, а вместо этого запускает базовую процедуру debug.writeline. В результате зависимая точка зрения [HttpPost] в «StudentInformation.cshtml» не получает заполненный экземпляр обновленной модели ...

Установка точки останова в первой строке модели для «StudentInformation .cshtml "и запуск приложения продемонстрирует, что модель, на которую ссылается в верхней части страницы, не содержит данных ...

Именно поэтому версия страницы [HttpPost] просто отображает пустую модель, без каких-либо измененных значений данных, которые вы, возможно, создали, UNTIL попадает в раздел, где представление зависит от количества новых значений данных, которые должны присутствовать в модели, которая вызывается в первой строке страницы ... для продолжения.

Пустой набор данных данных дает нулевую ссылку, поскольку в ней нет значений.

Чтобы просмотреть обновленную группу параметров, модели представления модели [HttpPost] должна быть передана экземпляр модели, которая возвращает новую информацию, как в «return View (nameOfViewDataSet)» (вы создаете данные снова установить и передать его как новую версию модели, с представленными пересмотренными данными формы).

До тех пор, пока не будут переданы данные, переданные с помощью заявления о возврате по отношению к [HttpPost] версии StudentInformation ActionResult, к фактическому представлению не будут отображаться данные, а функция count продолжит возвращать нулевое значение.

Я надеюсь, что это поможет.