ASP.NET MVC: как передать более одного объекта в метод View? - PullRequest
3 голосов
/ 21 марта 2010

Я закончил учебник по 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);
    }

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

Спасибо,
Иль

Ответы [ 5 ]

10 голосов
/ 21 марта 2010

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

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 } );
}
3 голосов
/ 21 марта 2010

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

1 голос
/ 21 марта 2010

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

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

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

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

0 голосов
/ 17 июля 2010

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

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

0 голосов
/ 21 марта 2010

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

...