NullReferenceException в частичном представлении, но не в «эквивалентном» представлении - PullRequest
1 голос
/ 09 августа 2011

Я новичок в MVC 3 / Razor и работаю над простым сайтом, чтобы изучить основы. Для этого я создал простое представление, которое отображает DropDownList на странице в / Home / SignedInAs.

Логика в моем домашнем контроллере:

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 () возвращает список объектов SignedInAs со свойствами, идентификатором и именем.

А в 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 Ответ

1 голос
/ 09 августа 2011

Вы должны либо передать модель в частичное представление, либо использовать Html.RenderAction, что потребует действия контроллера для поддержки этого представления.

...