NullReferenceException в моем коде - PullRequest
0 голосов
/ 13 декабря 2010

Я создал PartialView и вот как я его называю.

<div id="bodyarea">
    <div id="leftnavigationbar">     
        @Html.Partial("_SideBarMenu")
    </div>

    <div id="mainbody">
        @RenderBody()
    </div>

    <div id="footer">
    </div>
</div>

Вот фактический код PartialView:

@model Cumavi.ViewModels.SidebarNavigation

<ul>
    @foreach (var category in Model.Categories)
    {
        <li>category.Name</li>
    }
</ul>

Как видите, я использую пользовательскую модель ViewModel под названием SidebarNavigation, которая имеет следующий код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Cumavi.Models;

namespace Cumavi.ViewModels
{
    public class SidebarNavigation
    {
        public IEnumerable<Category> Categories { get; private set; }

        public SidebarNavigation()
        {
            CategoryRepository categoryRepo = new CategoryRepository();
            this.Categories = categoryRepo.FindAllCategories();
        }
    }
}

Проблема в том, что когда я запускаю приложение, я получаю исключение нулевой ссылки в цикле foreach.

Хотя я не понимаю причину. В ViewModel, SidebarNavigation, в конструкторе я фактически заполняю переменную. Есть предложения?

Edit:

Еще одна вещь, которую я заметил, заключается в том, что конструктор для моего класса ViewModel фактически никогда не вызывается. : S Должно быть, поэтому атрибут Categories имеет значение null. Предложения?

Редактировать 2:

Еще одна проблема! Я использую файл _Layout.cshtml для создания общего вида (главной страницы) приложения. Поскольку ни один контроллер не связан с этим файлом, как я могу передать ему модель? : S

Ответы [ 3 ]

3 голосов
/ 13 декабря 2010

Вы не передаете модель в частичное представление.

@Html.Partial("_SideBarMenu")

Все, что нужно, - это частичное представление, называемое _SideBarMenu.cshtml

Новаше частичное представление ожидает: Cumavi.ViewModels.SidebarNavigation

Пройдите через модель:

@Html.Partial("_SideBarMenu", model)

Кроме того - почему у вас есть ctor для SidebarNavigation , где вы заполняете категории?

Ваш контроллер должен создать экземпляр этой модели представления:

var model = new SideBarNavigational { Categories = repository.GetSomething() };
return View (model);

Вы должны никогда делать вызовы в ваш репозиторий через ваши модели представлений.

0 голосов
/ 13 декабря 2010

Для вашего сценария (если я правильно понимаю) вы должны использовать Html.Action вместо Html.Partial и создать новое действие, украшенное ChildActionOnlyAttribute.Как уже упоминалось в комментарии к другому ответу, частичные значения предназначены для многократной разметки.Для повторно используемых данных + разметки вы можете использовать дочерние действия.

Например, вы можете создать SharedController класс:

public class SharedController : Controller
    [ChildActionOnly]
    public ViewResult SideBar() {
        return new PartialView(new SideBarModel());
    }
}

И затем иметь представление SideBar.cshtml:

@model SideBarModel
.... Render contents here

А потом из вашего _Layout.cshtml файла звоните:

@Html.Action("SideBar", "Shared")
0 голосов
/ 13 декабря 2010

удалить свой частный метод доступа

public IEnumerable<Category> Categories { get; set; }

Вы уверены, что categoryRepo.FindAllCategories (); возвращает не нуль?

...