0

我已经创建了一个 Site.Master 文件,作为大多数站点的模板,并带有导航。此导航是基于递归实体(称为页面)动态创建的 - parentID 为 0 的页面是顶级页面,自然每个子项都会在该字段中携带其父项的 Id。

我创建了一个快速的小 HTML 帮助程序,它接受页面的 ID 并通过对具有与传递的 ID 匹配的 parentId 的子项执行 foreach 来生成导航。在大多数站点上,我希望 Site.Master 使用 0 的 parentId,但如果我在显示页面的强类型视图上,我自然希望使用页面的 Id。

有没有办法在 Site.Master 中执行这种条件逻辑(并且,这是否违反 MVC 规则)?“如果我在 /Page/{Id} 的强类型页面上,请使用 Id 渲染导航,否则使用 0”

4

2 回答 2

1

弄清楚了:

        int navPageId = 0;
        if (ViewContext.RouteData.Values["controller"] == "Pages" && ViewContext.RouteData.Values["Id"] != null)
        {
            navPageId = Convert.ToInt32(ViewContext.RouteData.Values["Id"]);
        }
        Html.RenderNav(navPageId);
于 2010-06-05T06:23:23.670 回答
1

听起来您的 PageID 仅在 Pages Controller 中有用。

考虑通过 将 PageID 传递ViewData到您的视图中。母版页可以简单地检查 ViewData 是否存在,并可选择调用您的 Html 帮助器方法。

页面控制器

    ViewData["PageID"] = somePageID; //zero or non-zero.

Master:当任何控制器实际上在 ViewData 中为 PageID 传递一个值时,将写入 Html 片段。当它没有通过时,它是对 null 的廉价检查。

<% if (ViewData["PageID"] != null)
{
   Response.Write(Html.RenderNav(ViewData["PageID"]));
}
%>

这种风格,对我来说,最有意义。PagesController 将一个简单的值传递给ViewData.

将此与母版页进行对比,尝试在每个请求上确定:URL 是什么,谁是控制器,好的,现在去获取 PageID,它是数字,好的,现在编写 HTML。所有这些逻辑都不属于视图。按照惯例:让 Views 保持沉默。

宁愿把它放在你的强类型 ViewModels 之外,而是在ViewData. 这样,它是对 Master 中存在性的简单检查,它不是强类型的。

我建议该ViewData策略更易于理解和维护。

听起来你想在 Master 中写出这个 Navigation。也许考虑将其移动到 Content Area,其中 View 可以对显示的内容进行细粒度控制?

页面视图

<asp:Content ID="nav" ContentPlaceHolderID="PagesNavContent" runat="server">
    <%= Html.RenderNav(ViewData["PageID"])%>
</asp:Content>
于 2010-06-05T04:27:57.853 回答