Меню загрузки ASP.net MVC 4 из базы данных в частичное представление

Я новичок в MVC.

Я пытаюсь загрузить меню из базы данных и отобразить его в частичном виде. Это частичное представление будет вызываться из представления _layout.

Домашний контроллер

в домашнем контроллере я добавляю действие под названием "_MainMenu"

public class HomeController : Controller
{
        mrpDatabase _db = new mrpDatabase();

        public ActionResult _MainMenu()
        {
          return PartialView("_MainMenu", _db.menu.ToList());
        }
        ....
}

PartialView

это мой _MainMenu PartialView

@model IEnumerable<appMRP.Models.menu>
<ul id="menu">
    @foreach (var item in Model)
    {
        <li>@item.menu1</li>
    }                                            
</ul>

Страница макета

это частичное меню отображается в моем _Layout.cshtml вот так

<nav>                     
  @Html.Partial("_MainMenu")
</nav>

когда я запустил это. я получил ошибку "NullReferenceException не было обработано пользовательским кодом. Ссылка на объект не установлена ​​на экземпляр объекта"

кажется, что "Модель" в моем _MainMenu имеет значение null

что я сделал не так ?

Спасибо


person Haqi Petrucci    schedule 15.01.2013    source источник


Ответы (2)


Если ваше частичное представление использует модель, вам необходимо передать ее следующим образом:

@Html.Partial("_MainMenu", Model.ListOfMenus)

Или что-то в этом роде. В настоящее время вы не указываете модель для _MainMenu представления, поэтому используется null. Когда вы пытаетесь выполнить @foreach, он генерирует исключение, которое вы видите.

Обратите внимание, что @Html.Partial("_MainMenu") не вызывает действие вашего _MainMenu контроллера, а просто отображает представление с этим именем.

Если вы хотите вызвать действие, вы можете использовать дочернее действие, подобное этому:

@Html.Action("_MainMenu", "HomeController")
person recursive    schedule 15.01.2013
comment
Спасибо. я использую @ Html.Action (_MainMenu, HomeController), и он работает - person Haqi Petrucci; 15.01.2013

ты уже получил ответ. проверьте, что _db.menu.ToList () не возвращает null. Я предлагаю вам использовать Model-View-ViewModel Pattern. создать модель для просмотра. и верните его в Просмотр, чтобы вы могли контролировать модель и то, что показывать в виде.

  1. Вы не передаете информацию о модели методу HTML Partial, поскольку в результате вы пытаетесь перебрать коллекцию. поэтому он вызовет исключение с нулевой ссылкой.

что-то вроде этого

 public class MenuViewModel
{
        public int menuID { get; set; }
        public string  menuname { get; set; }
        public string otherProperty { get; set; }
        public string someotherProperty { get; set; }
}

в вашем представлении

@model IEnumerable<MenuViewModel>

<nav>                     
  @Html.Partial("_MainMenu",Model)
</nav>
person Ravi Gadag    schedule 15.01.2013
comment
Спасибо. это добавляет мои знания о концепции MVC. - person Haqi Petrucci; 15.01.2013