MVC: как я могу передать список из одного представления в другое?

У меня есть некоторые данные в представлении, которые я хотел бы передать дочернему частичному представлению. Часть этих данных представляет собой список дат, которые я хотел бы отобразить в частичном представлении. Я почти уверен, что не могу передать IEnumerable из одного представления в другое (когда я пытаюсь, чтобы список был нулевым в контроллере). Предполагая, что это так, есть ли хорошая работа?

Я подумал о том, чтобы просто объединить значения в строку, а затем просто проанализировать эту строку в контроллере. Это кажется немного хакерским, но я думаю, что это сработает. Есть ли проблема сделать это так? Есть ли способ лучше?

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

Обновление: это модель для частичного просмотра:

public class SiteVisitDetailModel
{
    public String URL
    {
        get;
        set;
    }

    public List<DateTime> Dates
    {
        get;
        set;
    }
}

И это код из родительского представления для добавления частичного представления:

<% Html.Telerik().PanelBar().Name("PanelBar").HtmlAttributes(new { style = "padding-left: 0em;" }).Items(items =>
{
    foreach (var item in Model.Visits)
    {
        SiteVisitDetailModel model = new SiteVisitDetailModel();
        model.URL = item.Key;
        model.Dates = (from siteVisit in item
                             select siteVisit.Time).ToList();

        items.Add()
            .Text(item.Key.ToString() + " " + item.Count().ToString() + " visits")
            .LoadContentFrom("SiteViewDetail", "Report", model);        

    }
}).Render();

В методе действия SiteVisitDetail правильно задано значение model.URL, а значение model.Dates равно null.


person Mike Pateras    schedule 10.01.2010    source источник


Ответы (2)


Если я правильно понял вашу проблему...

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

<%Html.RenderPartial("PartialView",myList);%>

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

person Terje    schedule 10.01.2010
comment
Могу ли я передать список только строго типизированной модели? Если да, то как добавить список в ViewData родителя? Я пробовал делать как ViewData[test] = testing! и ViewData.Add(test, testing!) в самом представлении, а также в методе контроллера, который возвращает представление. Ни один из них не имеет никакого значения в частичном представлении. В идеале я хотел бы просто передать список (или модель, содержащую список) методу контроллера, который возвращает частичное представление. Разве это невозможно? - person Mike Pateras; 10.01.2010
comment
Поскольку ваше частичное представление SitesViewDetail теперь является строго типизированным представлением с SitesViewDetailModel в качестве модели, вы сможете сделать из него Model.Dates. Вы уверены, что после установки model.Dates у него действительно есть значения? Кроме того, представление должно быть как можно короче и понятнее и представлять только данные. Я бы построил свою модель (основной вид и, как таковой, также частичный вид) из действия контроллера, которое представляет код представления, который вы написали выше. - person Terje; 11.01.2010
comment
Я уверен, что данные существуют. Если я получаю доступ к нему в главном представлении, он выглядит просто отлично. Однако по какой-то причине в контроллере он оказывается нулевым, и я не думаю, что он имеет какое-либо значение в частичном представлении. Я дважды проверю последнее, но имеет ли значение, передаю ли я его частичному представлению или контроллеру? И есть ли способ проверить объект, прежде чем передать его в представление? Ставить точку останова не получается. - person Mike Pateras; 11.01.2010
comment
Вы должны объяснить передачу его контроллеру, поскольку это не имеет смысла, если только вы не отправляете свои данные в форму (что, насколько я знаю, может или не может делать ваш компонент телерика). Но основная предпосылка заключается в том, что Controller создает Model, который он передает View, так что View может сконцентрироваться на представлении этих данных. Таким образом, представление, которое вы представляете в своем вопросе, должно иметь возможность выполнять Model.Visits[x].Dates с самого начала, поскольку оно должно быть представлено с полным Model. По опыту я знаю, что при таком способе выборка данных в частичных представлениях работает должным образом. - person Terje; 11.01.2010
comment
Извините, я новичок в MVC и еще не владею всей терминологией. Посмотрите здесь: tinyurl.com/ya6ug52. Это показывает представление, как я строю модель и как я передаю ее методу LoadContentFrom Telerik и методу контроллера. Именно это я имел в виду, передавая модель контроллеру. Когда элемент управления загружает свое содержимое, вызывается метод контроллера SiteVisitDetail, и когда я устанавливаю на нем точку останова, Model.URL является правильным значением, а Model.Dates — нулевым. Как видите, я не делаю ничего особенного с Model.Dates, просто заполняю его DateTime.Now. - person Mike Pateras; 11.01.2010
comment
То же самое верно и для частичного представления, а не неожиданно. Model.URL установлен правильно, Model.Dates имеет значение null. - person Mike Pateras; 11.01.2010
comment
Был дан ответ на исходный вопрос о том, как передать список из одного представления в другое. Я собираюсь создать новую тему для решения проблемы, которая у меня возникла. Спасибо за помощь, Терье. Возможно, мы сможем разобраться с этим в новой ветке (я дам ссылку здесь через минуту). - person Mike Pateras; 11.01.2010
comment
stackoverflow.com/questions/2044547 / - person Mike Pateras; 12.01.2010
comment
Я нашел проблему. См. сообщение, на которое я ссылался в предыдущем комментарии, но похоже, что строка запроса неправильно создается элементом управления. - person Mike Pateras; 12.01.2010
comment
Рад, что нашли проблему :) - person Terje; 12.01.2010

Прочтите этот пост о том, как передавать модели.

По сути, вам, вероятно, следует передать модель в представление, содержащее ваш список. то вы можете продлить его позже.

Несколько моделей, отправленных в один экземпляр представления

person griegs    schedule 10.01.2010
comment
Я думаю, это то, что я пытаюсь сделать. Проблема в том, что объект списка имеет значение null, когда он попадает в контроллер. Я где-то видел, что нельзя передавать сложные типы, и предположил, что List (или IEnumerable) был таким типом. Это не тот случай, я так понимаю? У меня должна быть модель со списком, и я должен иметь доступ к этому списку в моем методе контроллера? - person Mike Pateras; 11.01.2010
comment
Да, вы должны быть в состоянии передать сложный тип. Я делаю. Возможно, вы захотите разбить список на PartilView, как предлагает @Terje. Это может помочь вам в отладке. Частичное представление будет строго типизировано, да, но я надеюсь, что это не должно быть проблемой. - person griegs; 11.01.2010
comment
Сейчас я попробую сделать модель просто списком и посмотрю, к чему это приведет. Спасибо за предложение. - person Mike Pateras; 11.01.2010