Asp.net MVC действий и просмотра вопроса - PullRequest
1 голос
/ 06 ноября 2011

Я застрял в странной ситуации.У меня есть действие контроллера, которому передается строка категории.Затем метод действия сопоставляет строку в базе данных и собирает подкатегории и продукты для нее.Теперь я хочу добиться разбиения на страницы для продуктов, если их больше 10. Представление строго типизировано для категории Модель

Ниже приведен код метода действия.

    public ActionResult Catalog(string id)
    {
        Category catalog = pe.Categories.Where(cat => cat.CategoryName == id).Single();
        return View(catalog);
    }

Я выполнил разбиение на страницы в моем другом проекте, как показано ниже, но в этом случае коллекция была IQueryable, чего не может быть в приведенном выше случае, поскольку она предназначена только для одной категории.Кроме того, я уже передаю аргумент в вышеупомянутой функции, так как я могу передать два.

    public ViewResult Index(int? page)
    {
        IQueryable<Album> albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist).OrderBy(a => a.Title);
        int pageIndex = page ?? 1;
        return View(albums.ToPagedList(pageIndex, PageSize));
    }

Скажите, пожалуйста, как вы будете решать этот сценарий?

Ответы [ 3 ]

1 голос
/ 06 ноября 2011

Вы должны сгенерировать свои постраничные результаты перед отправкой в ​​представление.Я полагаю, вам также нужно принять параметр индекса страницы.

public ActionResult Catalog(string id, int? pageIndex)
{
    Category catalog = pe.Categories.Where(cat => cat.CategoryName == id).Single();
    int pageIndex = page ?? 1;
    return View(catalog.Products.ToPagedList(pageIndex, PageSize));
}

Вы лучше используете интерфейс IEnumerable вместо IQueryable, когда выполняете операции в памяти.Сделайте ваш взгляд строго типизированным как IEnumerable<Product>, и он должен работать.

Если вы собираетесь использовать какие-либо данные из класса Category в вашем представлении, вам лучше создать ViewModel и поместить в него эти данные и результаты вашей страницы..

1 голос
/ 06 ноября 2011

Используйте viewmodel, чтобы собрать только ту информацию, которую вы хотите показать в вашем представлении. В логике выбора выберите в видовой модели атрибуты верхнего уровня из категории и соответствующих частей ассоциации. Конечно, вы можете иметь более одного параметра для метода. Укажите дополнительные параметры для значений маршрута в ваших вспомогательных методах ActionLink или Form, и он должен правильно создать URL для ссылки на ваше действие. Обратите внимание, что вам также потребуется изменить тип модели в представлении, чтобы он соответствовал действию.

public ActionResult Catalog(string id, int? page)
{
    page = page ?? 1;
    var category = pe.Categories.SingleOrDefault(cat => cat.CategoryName == id);
    var model = new CatalogViewModel
                {
                       ID = category.ID,
                       Name = category.CategoryName,
                       Subcategories = category.Subcategories,
                       Products = category.Products.ToPagedList( page, PageSize )
                };

    return View(model);
}

Просмотр (образец)

@if (Model.Products.Page < Model.Products.Pages)
{
    @Html.ActionLink( "Next",
                      "catalog",
                      new { id = Model.ID, page = Model.Products.Page + 1 } ) 
}
0 голосов
/ 06 ноября 2011

Начните с чтения официальных документов - Сортировка, фильтрация и подкачка с помощью Entity Framework в ASP.NET MVC

Как правило, вы можете передать столько параметров в действие, сколько захотите, поэтому вы добавляете pageNumber и используете его.

...