Как передать несколько объектов в ViewPage в ASP.NET MVC? - PullRequest
6 голосов
/ 26 октября 2008

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

Я хотел бы передать несколько (в данном случае 2) несколько разных частей данных в представление. Моя первоначальная мысль состоит в том, чтобы просто обернуть различные объекты в содержащий объект и передать их таким образом. Тогда из вида у меня было бы что-то вроде

var objContainer = ViewData.Model;
var thisObject = objContainer.ThisObject;
var thatObject = objContainer.ThatObject;

, и они могут использоваться независимо на главной странице и странице просмотра.

Это "лучший" способ?

Ответы [ 3 ]

11 голосов
/ 26 октября 2008

Я считаю полезным создавать дополнительные классы, предназначенные для представления в представлениях. Я держу их в отдельном пространстве имен, называемом «Core.Presentation», чтобы все было организовано. Вот пример:

namespace Core.Presentation
{
    public class SearchPresentation
    {
        public IList<StateProvince> StateProvinces { get; set; }
        public IList<Country> Countries { get; set; }
        public IList<Gender> Genders { get; set; }
        public IList<AgeRange> AgeRanges { get; set; }
    }
}

Затем я проверяю, что мое представление является строго типизированным представлением, которое использует общую версию этого класса представления:

public partial class Search : ViewPage<SearchPresentation>

Таким образом, в представлении я могу использовать Intellisense и легко перемещаться по элементам.

1 голос
/ 26 октября 2008

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

ViewData["foo"] = myFoo;
ViewData["bar"] = myBar;

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

1 голос
/ 26 октября 2008

У меня та же самая сделка. Вот мое решение (может быть, не самая лучшая практика, но оно работает для меня).

Я создал несколько классов «Группировка»:

public class Duo<TFirst,TSecond> { /*...*/ }
public class Trio<TFirst,TSecond, TThird> { /*...*/ }

и фабричный объект для их создания (чтобы воспользоваться выводом типа ... некоторые из TFirsts и TSeconds и TThirds могут быть LONG)

public static class Group{

public static Duo<TFirst, TSecond> Duo(TFirst first, TSecond second) { 
  return new Duo<TFirst, TSecond>(first, second);
 }    
/*...*/
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...