9

我试图找出如何在 asp.net mvc 中使用用户控件。我知道如何将用户控件添加到视图以及如何将数据传递给它。我无法弄清楚的是,您如何在不必检索和传递每个控制器中的数据的情况下做到这一点?

例如,如果我有一个用户控件,它在站点中的几个但不是所有页面上显示最近的帖子,我如何编写控制器以便我获取该用户控件的数据并将其仅从一个传递给用户控件放置在网站中,而不是在使用用户控件的每个不同控制器中获取和传递数据?

我不确定这是否有意义。是否有更好或推荐的方法来处理要在多个页面上显示的数据“孤岛”?

我来自网络表单,我可以编写一个用户控件,该控件获取自己的数据并独立于使用它的任何页面的其余部分显示数据。

4

4 回答 4

11

有多种方法可以做到这一点。

基本方法是

  • 为 BaseController 中的视图填充数据(OnActionExecuting 事件)
  • 编写自定义操作过滤器
  • 编写应用程序控制器(例如在下面的链接中)。

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>

我发现以下 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/

于 2008-11-29T02:56:21.197 回答
3

codeplex上可用的 MVC Futures 中,包含 RenderAction HtmlHelper 扩展。这将允许您为 ueser 控件创建一个控制器,并且该控制器将填充用户控件使用的 ViewData,而无需按照建议使用基本控制器。

在视图中你会做

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

或其他重载之一。

这将创建控制器的一个实例,执行该方法并将用户控件视图呈现到主视图中。主视图控制器不需要知道任何关于用户控件或其模型/数据的信息。

于 2008-11-29T18:20:52.000 回答
0

将获取此用户控件的视图数据的代码重构为它自己的方法,甚至可能是它自己的模型(类)。从需要填充控件的每个控制器调用此方法,并使用众所周知的键在 ViewData 中传递结果。您甚至可能希望将当前控制器的类型传递给您的方法,以防它需要知道要根据控制器的基本模型检索哪些数据。

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

在您的控件中,使用众所周知的密钥检索数据。

于 2008-11-29T02:20:03.017 回答
0

如何在 ASP.NET MVC 中处理“附加内容”

于 2008-11-29T03:09:55.320 回答