2013-12-05 3 views
0

Я новичок в ASP MVC, и после большой помощи от SO я прохожу через ViewModels. Однако, используя ViewModel, я столкнулся со следующей ошибкой.ASP MVC Просмотр сообщений null для контроллера

Учитывая следующий вид:

@model November.ViewModels.Staff_Salutation_VM 

//... 

using (Html.BeginForm("UpdateStaff", "Settings", FormMethod.Post, 
    new { @class = "clearfix parameter-form update-parameter update-staff", enctype = "multipart/form-data" })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    //...  

    @for (int i = 0; i < Model.AvailableStaffMembers.Count; i++) 
    { 
     var staff = Model.AvailableStaffMembers[i]; 
     <tr>    
      <td>@Html.HiddenFor(model => staff.ID)@Html.ValueFor(model => staff.ID)</td> 
      <td> 
       @Html.DropDownListFor( 
        model => model.SalutationID, Model.AvailableSalutations.Select(option => new SelectListItem 
         { 
          Text = option.Desc.ToString(), 
          Value = option.ID.ToString(), 
          Selected = (option.ID.ToString() == staff.SalutationID.ToString()) 
         } 
        ), 
       "Choose...") 
      </td> 
      <td>@Html.EditorFor(model => staff.FName)</td> 
      <td>@Html.EditorFor(model => staff.LName)</td> 
      <td>@Html.EditorFor(model => staff.Active)</td> 
      <td><a href="/Settings/[email protected](model => staff.ID)">Delete</a></td> 
     </tr> 
    } 

и следующий контроллер:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using November.Models; 
using November.ViewModels; 
using November.DAL; 

//... 

//GET 
var staffCreateViewModel = new Staff_Salutation_VM(); 

staffCreateViewModel.AvailableSalutations = new List<Prm_Salutation>(); 
var activeSalts = (from a in db.Prm_Salutations 
        where a.Active == true 
        orderby a.Desc ascending 
        select a); 
staffCreateViewModel.AvailableSalutations = activeSalts.ToList(); 

staffCreateViewModel.AvailableStaffMembers = new List<Prm_Staff>(); 
var activeStaff = (from a in db.Prm_Staffs 
        where a.Active == true 
        orderby a.LName ascending 
        select a); 
staffCreateViewModel.AvailableStaffMembers = activeStaff.ToList(); 

return View("StaffMembers", staffCreateViewModel); 



//POST 
public ActionResult UpdateStaff(Staff_Salutation_VM list) 
{ 
     if (ModelState.IsValid) 
     { 
      foreach (var formData in list) //no longer works due to dropping List<> 
      { 
       var tbl = db.Prm_Staffs.Where(a => a.ID.Equals(formData.ID)).FirstOrDefault(); 
       if (tbl != null) 
       { 
        var Prm_StaffModel = new Prm_Staff(); 

        Prm_StaffModel.SalutationID = formData.SalutationID; 
        Prm_StaffModel.FName = formData.FName; 
        Prm_StaffModel.LName = formData.LName; 
        Prm_StaffModel.Active = formData.Active; 
       } 
      } 
      db.SaveChanges(); 
      ViewBag.UpdateRtrn = "Successfully Updated."; 
      return RedirectToAction("Parameters", new { param = "Staff Members" }); 
     } 
     else 
      { 
       ViewBag.UpdateRtrn = "Failed ! Please try again."; 
       return RedirectToAction("Parameters", new { param = "Staff Members" }); 
      } 
     } 
     return RedirectToAction("Parameters", new { param = "Staff Members" }); 
} 

, и для хорошей мерой, сама ViewModel:

public class Staff_Salutation_VM 
{ 
     public int ID { get; set; } 
     public int SalutationID { get; set; } 
     public string FName { get; set; } 
     public string LName { get; set; } 
     public bool Active { get; set; } 

     public List<Prm_Salutation> AvailableSalutations { get; set; } 
     public List<Prm_Staff> AvailableStaffMembers { get; set; } 

     public Staff_Salutation_VM() { }   
} 

При срабатывании не форма значения заполняют ActionResult, в результате чего возникает исключение Object reference not set to an instance of an object., когда foreach (var formData in list) линия достигнута. Отладка показывает list как значение null. Как это может быть так? Вернее, что я делаю неправильно?

EDIT: переменная list в моем POST ActionResult теперь получает данные - или, по крайней мере, показывает различные типы в классе при отладке. Как я затем перебираю его, чтобы сохранить эти данные в соответствующих строках БД?

+0

Что произойдет, если вы удалите 'enctype =" multipart/form-data "и снова запустите? Кроме того, можете ли вы опубликовать свое действие, которое первоначально отображает представление? –

+0

@StinkyTowel Тот же результат, я боюсь. Обратите внимание, что есть два других ActionResults для этого же представления (форма создания и действие удаления), но они названы по-разному. Я не верю, что это фактор. – Eamonn

+0

Я не уверен, что, если модельная привязка работает таким образом, я думаю, вы должны получить значения из 'Request.Form' и проанализировать их самостоятельно. – Marthijn

ответ

1

Я полностью пропустил метод подписи, извините! Загрузка исходного изображения проходит мимо модели Staff_Salutation_VM, но UpdateStaff (форма размещена) ожидает List<Staff_Salutation_VM>. Это разные животные. Измените public ActionResult UpdateStaff(List<Staff_Salutation_VM> list) на номер public ActionResult UpdateStaff(Staff_Salutation_VM staff), чтобы узнать, прошло ли вы исключение null ref. Обратите внимание: вам нужно удалить свой foreach, так как у вас нет входящего IEnumerable.

+0

Итак, теперь 'list' содержит' {November.ViewModels.Staff_SalutationVM} ', который расширяется до' FName, LName, Active' и т. Д. Эти ключи, похоже, не имеют никаких значений, кроме 'null' или '0'. Мне нужно будет пройти через них, чтобы узнать. Как снова поместить это в интерфейс списка? Просто '.ToList()'? – Eamonn

+1

Хотя ваш входящий параметр называется 'list', это не' List <> ', а тип' Staff_Salutation_VM', поэтому вы не можете его перебирать. Однако вы спрашиваете об итерации через 'Доступные элементы 'в' Staff_Salutation_VM'? Не могли бы вы обновить сообщение с кодом для модели «Staff_Salutation_VM»? –

+0

Да, теперь это просто тип 'Staff_Salutation_VM', но мне не нужно будет перебирать его для обновления записей в БД? У меня есть несколько строк, отобранных в моем представлении, которые все обновляются. Я просто предположил, что мне нужно будет каким-то образом перебрать возвращаемые данные, чтобы сохранить его. Я сейчас обновлю свой вопрос ... – Eamonn

0

Я надеюсь, что этот пост будет вам полезен. Model Binding To A List

+0

Спасибо за ссылку, я просмотрел ее, хотя и (хотя я очень хорошо мог неправильно понять статью) m не уверен, что привязка - это моя проблема - нет данных, входящих * * на всех * для сопоставления. Я просто не знаю, как это может быть ... – Eamonn

+0

Вы можете добавить к вашему действию параметр FormCollection и изучить его, если есть какие-либо данные формы. Если данные будут представлены в этой коллекции, то ваша проблема будет связана с ModelBinding. –

+0

Нет данных формы. Это моя проблема :) – Eamonn

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