从母版页调用Html.RenderPartial

8
这是一个场景:假设我有一个网站,其中有两个控制器负责显示不同类型的内容 - 页面和文章。我需要将Partial View嵌入到我的主页面中,它将使用某些标准过滤列表页面和文章,并在每个页面上显示。我不能在我的主页面上设置Model(我是正确的吗?)。如何使用Html.RenderPartial解决这个问题?
[编辑] 是的,我可能会创建单独的局部视图来列出文章和页面,但仍然存在障碍,我不能也不应该在主页面上设置模型。我需要以某种方式传递“这里是页面”作为我的renderpartial参数,并且也适用于文章。在主页面中从数据库中获取数据的整个概念对我来说有点模糊。
7个回答

2
你可以创建一个HtmlHelper扩展方法,允许你在控制器上调用一个部分视图结果。例如:
 public static void RenderPartialAction<TController>(this HtmlHelper helper, Func<TController, PartialViewResult> actionToRender)
    where TController : Controller, new()
{
    var arg = new TController {ControllerContext = helper.ViewContext.Controller.ControllerContext};
    actionToRender(arg).ExecuteResult(arg.ControllerContext);
} 

您可以在主页面中使用类似以下的方式来使用它:
<% Html.RenderPartialAction((HomeController x) => x.RenderPartial()) %>

在你的控制器中编写适当的方法。

public PartialViewResult RenderPartial()
{

     return PartialView("~/Path/or/View",_homeService.GetModel())
}

总之这就是我的意见。


1

1

我之前有一个类似的帖子,然后想了一个对象模型来处理它。

我讨厌非强类型视图,所以采用了这种方法,目前效果良好。


0
这是一个很晚的回复,但我在谷歌搜索时找到了这个页面 - 所以很可能其他人也会看到这个问题(和我的回复)。
我解决这个问题的方法是使用一个简单的jQuery脚本来加载PartialView并执行它的控制器代码。下面是示例。
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

    <script type="text/javascript">
            $(document).ready(function() {
            $("#applicationForm").load("/Home/ApplicationForm");
            });
    </script>

    <div id="applicationForm" />

</asp:Content>

这种方法的一个很大缺点是,客户端必须启用脚本才能正常工作(因此对SEO不友好)。如果您可以容忍这一点,它会起到很好的作用。我只在内部网站上使用它,在那里我知道每个客户端都启用了JavaScript,并且不必担心谷歌机器人的问题。

0
我处理这个问题的方式是使用BaseViewModel。所有视图都针对从BaseViewModel继承的视图模型进行强类型化。
BaseViewModel类具有主页面所需的所有信息。因此,对于导航,您的BaseViewModel可能如下所示:
public class BaseViewModel
{
    public BaseViewModel()
    {
         NavigationItems = RetrieveNavigationItemsFromModel();
    }
    public List<NavItems> NavigationItems {get; set;}
}

在您的MasterPage和PartialViews中,您可以将Model转换为BaseViewModel并访问NavigationsItems属性。
<ul>
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %>
    <li>
        <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a>
    </li>
<% } %>
</ul>

0

ViewData Model属性仅应用于主界面上正在查看/编辑的内容。

视图的其他部分可能需要在ViewData中存在一些数据,所以只需将其添加到字典中。

我只是像这样从字典中传递数据:ViewData["articles"]到局部视图。(或者使用MvcContrib中的ViewData.Get()方法)。

您还可以查看最近在MvcContrib中实现的SubController模式。


0

是的,这是正确的。但让我们看看这种情况:

在与文章相关的视图上,我会有ViewData["article"],而在与页面相关的视图上,我有ViewData["pages"],但并不总是同时拥有文章和页面。因此,如果我添加:

Html.RenderPartial("articlesView", ViewData["articles"])

Html.RenderPartial("pagesView", ViewData["pages"])

到我的母版页中,我将在每个ViewDataDictionary不包含文章和页面的页面上引发异常。

至少,这就是我所看到的。


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