ASP.NET MVC: как передать более одного объекта в метод View?

Я закончил учебник по NerdDinner и теперь немного играю с проектом. На главной странице показаны все предстоящие обеды:

    public ActionResult Index()
    {
        var dinners = dinnerRepository.FindUpComingDinners().ToList();
        return View(dinners);
    }

В классе DinnerRepository у меня есть метод FindAllDinners и я хотел бы добавить к указанному выше методу индекса количество всех обедов, что-то вроде этого:

    public ActionResult Index()
    {
        var dinners = dinnerRepository.FindUpComingDinners().ToList();
        var numberOfAllDinners = dinnerRepository.FindAllDinners().Count();
        return View(dinners, numberOfAllDinners);
    }

Конечно, это не работает. Поскольку я довольно новичок в ООП, мне понадобится помощь с этим.

Спасибо,
Ile

5 ответов

Решение

Создать модель вида:

public class DinnerViewModel
{
    public List<Dinner> Dinners { get; set; }
    public int NumberOfAllDinners { get; set; }
}

public ActionResult Index()
{
    var dinners = dinnerRepository.FindUpComingDinners().ToList();
    var numberOfAllDinners = dinnerRepository.FindAllDinners().Count();
    return View(new DinnerViewModel { Dinners = dinners, NumberOfAllDinners = numberOfAllDinners } );
}

Вам необходимо создать объект-оболочку, который содержит объекты, которые вы хотите передать в качестве его открытых свойств. Например, создайте объект с именем DinnerViewModel и присвойте ему два свойства и задайте для них два свойства: одно - List с именем Dinners, а другое - int с именем DinnerCount. Затем передайте DinnerViewModel в представление, и вы можете получить доступ к Model.Dinners а также Model.DinnerCount

В вашем случае я бы предпочел решение, упомянутое LukLed.

В общем, вы можете, конечно, также передать несколько значений из вашего контроллера в представление с помощью ViewData:

ViewData["dinners"] = dinners;
ViewData["numberOfAllDinners"] = 150;
...

Для получения дополнительной информации также посмотрите на эту ссылку.

Просто используйте вместо этого свойство dinners.Count.

Помните, что вы начинаете с использования наследственных данных ViewData в ваших ASPX-файлах и возвращаете то же самое в ваших операторах возврата. Из-за этого я полагаю, что это была проблема с атрибутом Inherits в верхней части файлов ASP.NET. Но, если вы получаете сообщение об ошибке при попытке создать или отредактировать новый Обед, когда вы находитесь на странице "Предстоящие Обеды" (сгенерированной из файла Details.aspx и файла LINQ, который получает все Обеды, которые происходят после сегодняшней даты), перейдите в каталог "Контроллеры", в частности DinnerController.cs. Затем посмотрите на методы Edit и / или Create. ответ лежит прямо здесь. Если вы поставите точки останова на этих методах, вы сможете понять это. Если нет, продолжайте читать:

Посмотрите, где это терпит неудачу, строка "возврат...". Возможно, я единственный человек, который забыл изменить это, но моя ошибка та же, что и у людей, попадающих на эту страницу, и это, как я это исправил..... строка 'return(dinner)' в Create and Edit (и любые другие, с которыми у вас возникают проблемы), они используют метод NerDinner.Model.Dinner / ViewData. Однако, если вы измените его на метод возврата ViewModel, он должен это исправить, например: 'return(new DinnerFormViewModel(dinner));', он должен работать для вас. Я надеюсь, что это помогает, поскольку это было то, что было моей проблемой. Просто упускать из виду.

Другие вопросы по тегам