1

我知道问这个问题很愚蠢,但我无法弄清楚,我需要你们的帮助。

首先,我是 MVC 的新手。在我的项目中,我使用 dropdownlistFor 帮助器来显示可用于特定 ID 的名称列表。我这样做了,它显示了一个 id 的名称。

现在,在发布表单时,我得到了下拉列表中使用的属性的空引用异常。

这是我在模型中的属性,它是一个名称列表。

在 [HttpGet] 的控制器中,我执行了此操作,它调用一个函数并返回该 ID 的名称列表。

现在正在加载表单时显示名称列表。我的观点是

当我提交表单时,我收到空引用异常,因为在新的 SelectList(Model.InterviewerName) 中,模型为空。

有没有办法让我摆脱这个问题。

4

2 回答 2

1

我认为你应该像这样更新你的视图模型:

public class InterviewViewModel
{
  public List<SelectListItem> Interviewers { set;get;}
  public int SelectedInterviewerID { set;get;}
  //Other properties relevant to the view as needed
}

并在您的 GET 操作中设置Interviewers集合属性:

public ActionResult Interview()
{
  var vm=new InterviewViewModel();
  vm.Interviewers =GetInterViewrsFromSomewhere();
  return View(vm);
}
public List<SelectListItem> GetInterViewrsFromSomewhere()
{
  var list=new List<SelectListItem>();
  //Items hard coded for demo. you can read from your db and fill here
  list.Add(new SelectListItem { Value="1", Text="AA"});
  list.Add(new SelectListItem { Value="2", Text="BB"});
  return list;
}

在您看来,这是强类型的InterviewViewModel

@model InterviewViewModel
@using(Html.Beginform())
{
 <p>Select interviewer :
 @Html.DropdownlistFor(x=>x.SelectedInterviewerID,Model.Interviewers,"Select")
 <input type="submit" />
}

因此,当表单发布时,选定的采访者 ID 将在SelectedInterviewerID属性中可用:

[HttpPost]
public ActionResult Interview(InterviewViewModel model)
{
  if(ModelState.IsValid)
  {
    //check for model.SelectedIntervieweID value
    //to do  :Save and redirect
  } 
  //Reload the dropdown data again before returning to view
  vm.Interviewers=GetInterViewrsFromSomewhere();
  return View(vm);
}

在 HttpPost 操作方法中,如果要将视图模型返回到视图,则需要重新填充下拉内容,因为 HTTP 是无状态的,它不会在请求之间保留下拉内容(Webforms 使用 Viewstate 和此处在 MVC 中执行此操作我们没有那个)。

于 2013-09-17T14:44:40.847 回答
0

我想我发现了问题,你需要做以下两件事来解决,

1)将模型属性更改public IList<string> InterviewerNamepublic string InterviewerName

2) 使用 ViewBag 将选择列表值带到视图中。

让我知道它是否有帮助。

于 2013-09-17T14:46:48.137 回答