【问题标题】:How do you use usercontrols in asp.net mvc that display an "island" of data?您如何在 asp.net mvc 中使用显示数据“孤岛”的用户控件?
【发布时间】:2008-11-29 01:10:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net asp.net-mvc user-controls controller viewdata


    【解决方案1】:

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

    基本做法是

    • 为 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>
    

    我发现以下网址很有用。

    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/

    【讨论】:

    • 对如何使用强类型视图执行此操作有任何想法吗?
    • 没关系,我只是把它放在 OnActionExecuted 中,效果很好。
    【解决方案2】:

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

    在你会做的视图中

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

    或其他重载之一。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 有什么方法可以实现它,这样您就不需要在每个控制器中调用类/方法来将数据传递给持有用户控件的视图?
      • 并非如此——您必须以某种方式将数据填充到 ViewData 中。 @Rajesh 的回答有一些建议,通过从为所有子控制器实现此功能的基类派生控制器来简化控制器。
      【解决方案4】:

      【讨论】:

      • 您可以查看我为侧面内容突出显示的上述方法。事实上,我使用“标签”作为附带内容。您可以拥有一个边内容“用户控件”并将其数据填充到基本控制器中,以便在需要时可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2012-03-06
      相关资源
      最近更新 更多