Html.ListBoxFor对象引用未设置为对象的实例Error

时间:2014-10-31 02:21:38

标签: html asp.net-mvc entity-framework listbox

我使用视图模型显示下拉列表,我也试图获取所选列表的值,这是我的视图模型

public class CreateJobViewModel
{
    public int[] SelectedIndustriesIds { get; set; }
    public IList<SelectListItem> IndustriesList { get; set; }
}

我的控制器

public ActionResult Create()
{
    var industryList = repository.GetAllIndustries();

    var model = new CreateJobViewModel
    {
        IndustriesList = industryList.Select(i => new SelectListItem
        {
            Value = i.IndustryId.ToString(),
            Text = i.Name
        }).ToList()
    };

    return View("~/Views/Dashboard/Job/Create.cshtml", model);
}

我的帖子控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateJobViewModel model)
{

    try
    {
        var job = new Job()
        {
            Title = "hi",
            EmploymentHourId = 1,
            LocationId = 1,
            Salary = 50,
            SalaryPeriodId = 1,
            PostCode = 2131,
            Role = "world",
            Description = "hello",
            IsPublished = false,
            ShiftId = 1,
            WorkDayId = 1,
            NumberOfPosition = 5,
            Meal = false,
            SecondYearVisa = true,
            Sponsorship = true,
            Accommodation = true,
            DurationId = 1,
            IndustryExperiencePeriod = 5,
            Id = User.Identity.GetUserId(),


        };
        foreach (int id in model.SelectedIndustriesIds)
        {
            var industry = repository.Industry(id);
            job.Industries.Add(industry);
        }



        foreach (int id in model.SelectedSpecialRequirementsId)
        {
            var special = repository.SpecialRequirement(id);
            job.SpecialRequirements.Add(special);
        }

        repository.AddJob(job);

        return RedirectToAction("Create");
    }
    catch
    {
        return View("~/Views/Dashboard/Job/Create.cshtml");
    }
}

每当我尝试提交所选值时,我的对象引用都没有设置为对象的实例错误在我视图中的以下行:

@model Taw.WebUI.Models.CreateJobViewModel

@Html.ListBoxFor(m => m.SelectedIndustriesIds, Model.IndustriesList) -- here i get the error

有什么理由?

1 个答案:

答案 0 :(得分:1)

当您提交表单时,抛出异常(在注释中确认)并在catch块中返回视图,这会抛出您看到的异常,因为Model.IndustriesList为空。您需要在返回视图之前重新分配值。

由于你需要在GET方法和POST方法中分配SelectList,如果你返回视图,我倾向于将其重新分解为一个单独的方法,以保持控制器代码更清洁。请注意,以下代码基于您的模型属性public SelectList IndustriesList { get; set; },这比构建IList<SelectListItem>

简单一点
private void ConfigureViewModel(CreateJobViewModel model)
{
  var industryList = repository.GetAllIndustries();
  model.IndustriesList = new SelectList(industryList, "IndustryId", "Name")
  // any other common stuff
}

然后在动作方法

public ActionResult Create()
{
  var model = new CreateJobViewModel();
  ConfigureViewModel(model);
  return View(model);
}

public ActionResult Create(CreateJobViewModel model)
{
  try
  {
    ....
  }
  catch
  {
    ConfigureViewModel(model);
    return View(model);
  }
}

注意在尝试保存模型之前测试模型是否有效也是一种很好的做法

public ActionResult Create(CreateJobViewModel model)
{
  if (!ModelState.IsValid)
  {
    ConfigureViewModel(model);
    return View(model); // return the view so the user can correct validation errors
  }
  ....