在ASP.NET MVC中如何使用用户控件来显示“数据岛”?

9
我正在尝试找出如何在ASP.NET MVC中使用用户控件。我知道如何将用户控件添加到视图中以及如何向其传递数据。但是,我无法弄清楚的是如何在不必在每个控制器中检索和传递数据的情况下完成此操作。
例如,如果我有一个用户控件,用于显示最近发布的文章,但不是所有页面都需要显示,那么我该如何编写控制器才能从网站的一个地方获取数据,并将其传递给该用户控件,而不是在使用该用户控件的每个不同控制器中都进行数据的检索和传递?
我不确定这是否有意义。是否有更好或推荐的方法来处理您想要在多个页面上显示的“数据岛”?
我之前使用Web Forms,可以编写一个用户控件,独立于其所在页面的其他部分,获取并显示自己的数据。
4个回答

11

有多种方法可以实现它。

基本方法如下:

  • 在BaseController中填充视图数据(在OnActionExecuting事件中)
  • 编写自定义的Action过滤器
  • 编写一个应用控制器(例如链接中的示例)。

OnActionExecuting的示例将是:

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

    }

您可以在任何视图上使用“标签”查看数据。这只是将用户控件呈现为侧面内容的示例。

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

我发现以下网址非常有用:

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/


有没有关于如何使用强类型视图来完成这个的想法? - Beep beep
没关系,我刚把它放在OnActionExecuted里面了,效果很好。 - Beep beep

3
在MVC Futures中,可以在codeplex上获得RenderAction HtmlHelper扩展。这将允许您为用户控件创建一个控制器,并且该控制器将填充用户控件使用的ViewData,而无需采用建议的基本控制器。
在视图中,您需要这样做:
<% Html.RenderAction("Index", "UserControlController") %>

或者使用其他重载方法。

这将创建控制器的实例,执行该方法并将用户控件视图呈现到主视图中。主视图控制器不需要了解用户控件或其模型/数据。


0

您可以查看我在侧边内容中突出显示的上述方法。实际上,我正在使用“标签”作为侧边内容。您可以拥有一个名为“usercontrol”的侧边内容,并将其数据填充到基础控制器中,以便在需要时可用。 - rajesh pillai

0
将获取此用户控件的视图数据的代码重构为自己的方法,甚至是自己的模型(类)。从需要填充控件的每个控制器中调用此方法,并使用众所周知的键将结果传递到ViewData中。您甚至可能希望将当前控制器的类型传递给您的方法,以防它需要根据控制器的基本模型来获取什么数据。
 ViewData["RecentPosts"] = RecentPosts.GetRecentPosts( this.GetType() );

在你的控制下,使用众所周知的密钥检索数据。

有没有办法实现,在每个要传递数据到包含用户控件的视图的控制器中,您不需要进行类/方法调用? - dtc
并不是真的--你必须以某种方式在ViewData中填充数据。@Rajesh的答案提供了一些建议,通过从实现所有子控制器的基类派生您的控制器,可以使其更容易实现。 - tvanfosson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接