1

Возьмите пример, чтобы иметь боковую панель «Последние новости» на каждой странице вашего веб-сайта ASP.NET MVC. У меня есть NewsItemController, который отлично подходит для страниц, посвященных их вниманию NewsItems. Как насчет того, что боксер новостей появляется на HomeController для домашней страницы? Или любой другой контроллер, если на то пошло?Где применять логику для управления боковой панелью в ASP.NET MVC

Мой первый инстинкт заключается в том, чтобы поместить логику для выбора топ-5 NewsItems в пользовательском элементе управления, который затем вызывается на главной странице. Таким образом, каждая страница получает боковую панель новостей, не заражая ни один из других контроллеров логикой NewsItem. Это значит, что логика в том, что я понял, является уровнем представления, который обычно входит в контроллер.

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

+0

Вы используете сильно типизированных? – jfar

ответ

1

http://eduncan911.com/blog/html-renderaction-for-asp-net-mvc-1-0.aspx

Это, кажется, решить вопрос - даже при использовании экземпляра боковой панели - но с помощью функции не входит в комплект с MVC 1 по умолчанию.

http://blogs.intesoft.net/post/2009/02/renderaction-versus-renderpartial-aspnet-mvc.aspx

Это также указывает на то, что ответ лежит в RenderAction.

Для всех, кого это интересует, вот как я это сделал. Обратите внимание, что вам понадобится сборка MVC Futures для RenderAction.

В основном вы бы иметь что-то вроде этого в контроллере:

public class PostController 
{ 

//... 

    public ActionResult SidebarBox() 
    { 
     // I use a repository pattern to get records 
     // Just replace it with whatever you use 
     return View(repoArticles.GetAllArticles().Take(5).ToList()); 
    } 

//... 

} 

Затем создайте частичный вид на SidebarBox с содержимым, которое будет отображаться, и в вашем мастер-странице (или там, где вы хотите отобразить его) вы бы использовали:

<% Html.RenderAction<PostController>(c => c.SidebarBox()); %> 

Не так сложно в конце концов.

1

Думаю, вам стоит подумать о том, чтобы положить его на свою главную страницу. Ваш контроллер может собирать данные (асинхронно, конечно), хранить его в хорошем свойстве ViewModel для вашего представления (или в TempData), а затем вы можете вызвать RenderPartial() на главной странице, чтобы отобразить данные.

держит все «отдельный»

+3

RenderPartial не предлагает такого рода разделение, в котором я был. Однако RenderAction выполняет эту работу. Я обновил исходное сообщение соответствующим ответом. – nathanchere

+1

До тех пор, пока вы можете позволить себе несколько проходов по циклу «действия», это также действительный путь. –

1
  1. Вы можете создать пользовательский элемент управления (.ascx), а затем вызвать RenderPartial().
  2. Создайте метод в вашем контроллере с JsonResult как возвращаемый тип. Используйте его вместе с jQuery.
  3. Используйте RenderAction(), как предложено в другом месте.

News section with ASP.NET MVC

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