【问题标题】:Pass data to User Control ASP.NET MVC将数据传递给用户控件 ASP.NET MVC
【发布时间】:2010-12-21 21:27:33
【问题描述】:

我有一个显示最新公告列表的用户控件。这个用户控件将用于我几乎 90% 的页面。现在我关心的是如何将数据传递给此用户控件以获取最新公告。

我的第一种方法是制作一个基本控制器,并在 Initialise 方法中通过 ViewBag/ViewData 将数据传递给用户控件。我所有的其他控制器都来自这个基本控制器。这看起来不错,但我担心它可能会成为一些已经存在的简单解决方案的过度杀伤力。此外,我还需要确保没有控制器会摆弄我的 Viewdata/Viewbag 数据,这些数据是用于我的用户控件的。

请让我知道这是正确的前进方式还是存在更好的解决方案。

谢谢

【问题讨论】:

    标签: asp.net-mvc user-controls partial-views


    【解决方案1】:

    假设您有一个“用户控件”(您应该尝试在 MVC 中将它们称为部分视图),如下所示:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Announcement>>" %>
    

    这意味着您的局部视图需要一个 Announcement 对象列表。

    现在,问题是 - 你在哪里渲染这个局部视图

    您可以从母版页执行此操作,您可以从一个视图执行此操作,或者您可以从另一个部分视图执行此操作。

    无论哪种方式,渲染部分的代码都需要如下所示:

    <% Html.RenderPartial("LatestAnnouncements", announcements) %>
    

    但是 - 你从哪里得到公告。

    假设您有一个 Repository/DAL/helper 方法来获取最新公告 - 我认为您应该拥有需要从基本 ViewModel 继承的 ViewModel:

    public class AnnouncementViewModelBase
    {
       protected IEnumerable<Announcement> GetAnnouncements()
       {
           // call DAL
       }
    } 
    

    然后,任何需要渲染最新公告部分的 master/view/partial 都应该绑定到从该基本视图模型继承的 ViewModel。

    在 master/view/partial 不是强类型(例如动态视图)的情况下,您可以将其粘贴在 ViewData 中。但是,如果您正确组织了视图,则不需要这样做。

    【讨论】:

    • 继续使用这种方法,我想将数据从母版页传递到用户控件,但母版页没有代码。那怎么办呢?
    • 是的 - 这很难。您有两个选择 - 1) 将最新公告放入 ViewData。 2) 使用 RenderAction 调用一个动作方法,该方法抓取最新公告并呈现PartialViewResult。选项 2 可能会更容易。
    • RenderAction 听起来不错。这可能意味着我为所有此类用户控件创建一个操作列表并使用它。你没告诉我 Base Controller 的声音怎么样?
    • 不 - 你只需要一个动作,它可以从任何地方调用。我不喜欢基本控制器的原因是通常应该根据功能区域创建控制器。 “最新公告”是一个小功能,应该只属于一个控制器,而不是整个区域 - 所以我看不出多个控制器如何需要这种行为。
    • 只有一件事..渲染动作在父控制器之外是无用的。如果我想从控制器中调用一个动作该怎么做?
    【解决方案2】:

    【讨论】:

    • 不,我的控件需要一个强类型列表。我不确定如何将数据传递给这个控件。它必须是某个中心位置,我觉得基本控制器是一个不错的选择。说什么?
    【解决方案3】:

    在这种情况下你应该使用 RenderAction,这样你就不用费心在你的控制器的每个动作方法中传递所需的数据了。

    【讨论】:

      【解决方案4】:

      我认为最好的方法是使用@Html.Action。这将允许我调用专门用于我的用户控件数据的操作,并且我可以从任何地方调用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-12
        • 2012-01-22
        • 1970-01-01
        • 2012-03-21
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        相关资源
        最近更新 更多