部分视图中的NullReferenceException,但不是“等效”视图中的NullReferenceException

时间:2011-08-09 03:48:11

标签: asp.net-mvc-3 razor partial-views

我是MVC 3 / Razor的新手,并在一个简单的网站上学习基础知识。为此,我创建了一个简单的视图,在/ Home / SignedInAs页面上呈现DropDownList。

我的家庭控制器中的逻辑是:

public class HomeController : Controller  
{  
  public ActionResult SignedInAs()  
  {  
    SignedInAsViewModel siavm = new SignedInAsViewModel();  
    siavm.SignedInAsOptions = db.GetSignedInAsOptions();  
    return View(siavm);
  }  
}  

其中SignedInAsViewModel很简单:

public class SignedInAsViewModel  
{  
  public SignedInAsViewModel()  
  {  
    this.SignedInAsOptions = new List<SignedInAs>();  
  }  

  public IEnumerable<SignedInAs> SignedInAsOptions { get; set; }  
}

和方法db.GetSignedInAsOptions()返回带有属性,ID和名称的SignedInAs对象的List。

在Views / Home / SignedInAs.cshtml中,我有:

@model myMVCApp.Views.SignedInAsViewModel  
...  
@Html.DropDownList("ddlSignedInAs", new SelectList(Model.SignedInAsOptions, "ID", "Name", selectedValue))
...

选择列表在我的页面/ Home / SignedInAs上完全按照预期呈现。

我真正想做的是将DropDownList渲染到每个页面的顶部。所以,我创建了一个局部视图,_SignedInAsPartial:

@model myMVCApp.Views.SignedInAsViewModel
@if (Request.IsAuthenticated)
{   
  <text><div>@Html.DropDownList("ddlSignedInAs", new SelectList(Model.SignedInAsOptions, "ID", "Name", selectedValue))</div></text>
}  

一个控制器,SignedInAsController:

public class SignedInAsController : Controller
{
  public ActionResult ShowSignedInAs()
  {
    SignedInAsViewModel siavm = new SignedInAsViewModel();
    siavm.SignedInAsOptions = GetSignedInAsOptions();
    return PartialView(siavm);
  }
}  

(我在这里也试过return View(siavm)。)

在我所有页面使用的_Layout.cshtml中:

@Html.Partial("_SignedInAsPartial")  

现在尝试加载任何页面会导致NullReferenceException,并且可视化调试器将停在_SignedInAsPartial.cshtml

断点永远不会在SignedInAsController中被击中。

我在这里显然不明白,我已经阅读了所有我能找到的东西。但我无法弄明白。为什么选择列表在页面视图上渲染得很好,但在局部视图上却没有?

1 个答案:

答案 0 :(得分:1)

您必须将模型传递给局部视图,或者您可以使用Html.RenderAction,这需要控制器操作来支持该视图。