Как вы используете usercontrols в asp.net mvc, которые отображают «островок» данных? - PullRequest
9 голосов
/ 29 ноября 2008

Я пытаюсь выяснить, как использовать usercontrols в asp.net mvc. Я знаю, как добавить пользовательский контроль в представление и как передать в него данные. То, что я не смог выяснить, это как сделать это без необходимости извлекать и передавать данные в каждый контроллер?

Например, если у меня есть пользовательский элемент управления, который отображает самые последние сообщения на нескольких, но не на всех страницах сайта, как мне написать контроллеры, чтобы получить данные для этого пользовательского элемента управления и передать их в пользовательский элемент управления только из одного места на веб-сайте вместо получения и передачи данных в каждый из различных контроллеров, в которых используется пользовательский элемент управления?

Я не уверен, имеет ли это смысл или нет. Есть ли лучший или рекомендуемый способ обработки «островка» данных, который вы хотите отобразить на нескольких страницах?

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

Ответы [ 4 ]

11 голосов
/ 29 ноября 2008

Есть несколько способов сделать это.

Основной подход

  • Заполнение данных для представления в BaseController (событие OnActionExecuting)
  • Написание фильтра пользовательских действий
  • Написание Application Controller (например, в ссылках ниже).

Примером OnActionExecuting будет

   [HandleError]
    public class BaseController : Controller
    {
        CourseService cs = new CourseService();
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            List<Tag> tags = cs.GetTags();
            ViewData["Tags"] = tags;
        }

    }

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

<div id="sidebar_b">
         <asp:ContentPlaceHolder ID="ContentReferenceB" runat="server" >
             <% Html.RenderPartial("Tags"); %>
         </asp:ContentPlaceHolder>
   </div>

Я нашел следующий URL полезным.

http://weblogs.asp.net/stephenwalther/archive/2008/08/12/asp-net-mvc-tip-31-passing-data-to-master-pages-and-user-controls.aspx

http://blog.matthidinger.com/2008/02/21/ASPNETMVCUserControlsStartToFinish.aspx

http://www.aaronlerch.com/blog/2008/01/26/displaying-foo-on-every-page-of-an-aspnet-mvc-application/

http://blog.wekeroad.com/2008/01/07/aspnet-mvc-using-usercontrols-usefully/

3 голосов
/ 29 ноября 2008

В MVC Futures, доступном по codeplex , содержится расширение RenderAction HtmlHelper. Это позволит вам создать контроллер для элемента управления ueser, и этот контроллер будет заполнять данные ViewData, используемые пользовательским элементом управления, без необходимости прибегать к базовому контроллеру, как было предложено.

В представлении вы бы сделали

<% Html.RenderAction("Index", "UserControlController") %>

или одна из других перегрузок.

Это создаст экземпляр контроллера, выполнит метод и отобразит представление управления пользователя в главном представлении. Контроллеру основного представления не нужно ничего знать о пользовательском элементе управления или его модели / данных.

0 голосов
/ 29 ноября 2008
0 голосов
/ 29 ноября 2008

Рефакторинг кода, который получает данные представления для этого пользовательского элемента управления, в его собственный метод, возможно, даже в его собственную модель (класс). Вызовите этот метод из каждого контроллера, который должен заполнить элемент управления, и передать результаты в ViewData с известным ключом. Возможно, вы даже захотите передать тип текущего контроллера вашему методу, если ему нужно знать, какие данные нужно извлечь на основе базовой модели для контроллера.

 ViewData["RecentPosts"] = RecentPosts.GetRecentPosts( this.GetType() );

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

...