DropdownListFor - 页面模型上的空引用异常

时间:2011-03-03 03:33:04

标签: entity-framework-ctp5

我正在尝试将我的一个模型保存到数据库中。鉴于模型:

public class Foo {
     public int Id { get; set; }
     public string Name { get; set; }
     public virtual Bar Something { get; set; }
}

public class Bar {
     public int Id { get; set; }
     public string Name { get; set; }
}

public class FooPageModel {
    public Foo F { get; set; }
    public List<SelectListItem> Bars { get; set; }
}

在我的控制器中我有:

public ActionResult Add(){
     var bars = ... // get all bars from db context
     var barsList = new List<SelectListItem>();
     barsList.AddRange(bars.Select(b => new SelectListItem {
          Text = b.Name,
          Value = b.Name
     }));

     var model = new FooPageModel
     {
          Bars = barsList
     };
     return View("Add", model);
 }

现在为View(强类型为FooPageModel):

<%: Html.DropdownListFor(f => f.F.Bar, Model.Bars) %>

视图呈现正常,具有我期望的值,但是当我提交页面表单时,我得到NullReferenceException(在到达控制器上的操作之前粘贴在上面的视图行上)。我想如果我将控制器代码修改为:

var model = new FooPageModel
{
     F = new Foo(),
     Bars = barsList
}

然而,这也失败了。我想我可以重写FooPageModel只是我想要的信息的字符串列表,但复制模型逻辑似乎是多余的;我对CTP一般都很陌生,所以也许这就是它的完成方式?

我能够为ComplexType(地址模型)编写类似的代码,并且没有任何问题。如果堆栈跟踪有用,请告诉我,我会发布它。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您没有显示返回ActionResult的代码,但是您需要确保将模型传递给视图,如下所示:

public ActionResult Add() {
    ...

    return View(model);  // send the model to the view
}