2009-10-21 5 views
0

Возможно ли сделать что-то подобное в ASP.NET MVC-контроллере?Можно ли передавать классы между контроллерами в ASP.NET MVC?

public ActionResult Index(CustomADT adt) 
{ 
    ... 
} 

И вы пройдете в классе от другого контроллера, когда вы нажмете на ссылку. Или можно только обходить строки?

Edit:

Немного больше разработка. Скажем, у меня есть следующие иерархии классов:

public class Area 
{ 
    public string Name { get; set; } 
    public ICollection<Building> Buildings { get; set; } 
} 

public class Building 
{ 
    public string Name { get; set; } 
} 

Так Area содержит список Buildings. Теперь у меня два контроллера: AreasController и BuildingsController. Оба имеют метод Index(). То, что я хотел бы сделать это, когда этот URL будет перемещаться к:

http://localhost/Areas/

Это будет список всех областей. Затем, когда вы идете к этому URL:

http://localhost/Areas/1/Buildings/

Это будет список всех зданий для области с ID 1. В BuildingsController, я получаю идентификатор как межд, а затем использовать его для найти правильную площадь, например:

public ActionResult Index(int areaId) 
{ 
    var area = areaRepository.GetById(areaId); 
    return View(area.Buildings); 
} 

Теперь это кажется довольно неуклюжим для меня. AreaId должен быть получен как int, тогда я должен снова попасть в репозиторий, чтобы получить фактический объект Area. Есть ли способ, что я могу сделать это вместо того, чтобы:

public ActionResult Index(Area area) 
{ 
    return View(area.Buildings); 
} 

И не попал в репозиторий снова и снова получить объект, который уже был создан экземпляр? Я склоняюсь к нулю из-за того, как работает HTTP (вы не можете поместить объект в URL-адрес), но, возможно, у кого-то есть аккуратный трюк.

+0

Кажется, вы пытаетесь решить проблему, которая не описана в вашем вопросе. Что это за история вопроса? – spender

+0

Не много фона, на самом деле. Во всех обучающих программах, которые я видел, они передают только строки и ints (которые только что передаются в ints) между контроллерами, например, когда вы нажимаете на ссылку. Это очень похоже на работу HTTP, но не столько на то, как работает программирование. Поскольку контроллеры - это просто классы, мне было интересно, есть ли способ передать классы между контроллерами, хотя теперь, когда я думаю об этом, я не думаю, что это возможно, потому что вы делаете HTTP-запрос, который затем вызывает контроллер. –

+0

«И не снова попадайте в репозиторий и снова возвращайте объект, который уже был создан» ... Уже где? Если действие вашего контроллера не будет выглядеть так, что будет? (Как вы намекаете, безгражданный характер HTTP означает, что там действительно ничего нет * вне вашего собственного кода. Несмотря на поведение ModelBinder.) –

ответ

0

Я нашел возможный ответ здесь:

http://msdn.microsoft.com/en-us/library/dd394711%28VS.100%29.aspx

В разделе озаглавленном Передача состояния между методами действий. В основном вы храните объект в словаре TempData, а затем ссылаетесь на него как на строку. Это уродливое решение, хотя оно не сильно типизировано.

+0

TempData - * сильно * напечатан. Тем не менее, это не * статически * напечатано. –

+0

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

+0

Это все правильно, но это не меняет того, что я написал. Существует различие между сильной типизацией и статической типизацией. То, что вам нужно бросить, говорит вам, что оно не слабо типизировано. Это, однако, динамически, в отличие от статического, типизированного. –

2

Да, это возможно. Более того, он встроен непосредственно в MVC с так называемым «ModelBinders». Взаимодействующие модели используют отражение для сопоставления пар ключей/значений querystring/form с вашим объектом класса CustomADT. То, что у вас есть, будет работать отлично, если ваша форма представляет те же имена свойств.

Ваша форма ...

<% using (Html.BeginForm()) { %> 

    <%= Html.TextBox("Title", Model.Title) %> 
    <%= Html.TextBox("Description", Model.Description) %> 

<% } %> 

Ваш класс ...

public class CustomADT 
{ 
    public String Title {get; set;} 
    public String Description {get; set;} 
} 

Обратите внимание, как свойства вашего класса совпадают с формой ключ/значение? ASP.NET MVC имеет встроенный модуль, который будет отображать их вместе, с вашим примером Index (CustomADT adt) выше.

Если у вас есть особые требования к привязке, вы можете создать свой собственный класс IModelBinder и зарегистрировать его в своем global.asax для пользовательских сопоставлений между парами форм/значений формы и вашей моделью (классом).(bing it)

Кроме того, я настоятельно рекомендую прочитать шаблон «ViewModel» с помощью ASP.NET MVC (bing it).

Я также написал о том, как использовать строго типизированные методы действий, которые позволяют передавать классы из вашего представления в контроллер (а в контроллере - с расширениями в сборке Microsoft.Web.Mvc, которые я упоминаю).

http://eduncan911.com/archive/tags/Asp.Net+Mvc/default.aspx

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

return RedirectToAction("Index", "Home", myCustomADT); 

Я думаю, что должно работать в качестве последнего параметра представляет собой набор, который будет добавлен в качестве строки запроса. Если это не так (я сомневаюсь), вам необходимо передать каждое свойство как часть анонимной коллекции (, new {Title = myCustomADT.Title, Description = myCustomADT.Description);).

Лучший вопрос: зачем вам это нужно? Вы действительно хотите перенаправить и передать модели просмотра.

+1

Ему также может потребоваться переопределить его подпись контроллера как 'public ActionResult Index ([Bind (Prefix =" ")] CustomADT adt)'. – Jason

+0

Я пересмотрел свой вопрос с лучшим разъяснением того, что я пытаюсь сделать. Я думаю, что то, что я хочу сделать, немного отличается от того, что вы описали. –

Смежные вопросы