Я новичок в 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
теперь получает данные - или, по крайней мере, показывает различные типы в классе при отладке. Как я затем перебираю его, чтобы сохранить эти данные в соответствующих строках БД?
Что произойдет, если вы удалите 'enctype =" multipart/form-data "и снова запустите? Кроме того, можете ли вы опубликовать свое действие, которое первоначально отображает представление? –
@StinkyTowel Тот же результат, я боюсь. Обратите внимание, что есть два других ActionResults для этого же представления (форма создания и действие удаления), но они названы по-разному. Я не верю, что это фактор. – Eamonn
Я не уверен, что, если модельная привязка работает таким образом, я думаю, вы должны получить значения из 'Request.Form' и проанализировать их самостоятельно. – Marthijn