2010-06-05 20 views
0

我已经创建了一个Site.Master文件,该文件是我的模板,可用于导航的大多数站点。这个导航是基于递归实体(称为页面)动态创建的。 - parentID为0的页面是顶层,自然,每个子项都携带它在该字段中的父项Id。如何检查变量是否在ASP.NET MVC中的主文件中定义

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

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

回答

1

这听起来像您的PageID仅在页面控制器中有用。

考虑将PageID通过ViewData传递给您的视图。主页面可以简单地检查ViewData是否存在,并且可以选择调用你的Html辅助方法。

页数控制器

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

万事达:当任何控制器INFACT通行证PAGEID在ViewData的值,则该HTML代码段将被写入。当它没有通过时,这是一个廉价的空检查。

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

这种风格对我来说是最有意义的。 PagesController将一个简单的值传入ViewData

将此与主页面进行对比,试着确定每个请求:URL是什么,Controller是谁,OK,现在去获取PageID,是数字还是ok,现在写HTML。所有这些逻辑不属于视图。按照惯例:保持视图愚蠢。

希望保持您的强类型ViewModels,但在ViewData中使用。这样,这是一个简单的检查在主,这是不强类型的存在。

我会建议ViewData战略更容易理解和维护。

这听起来是你想在Master中写出这个导航。 也许可以考虑将它移动到内容区域,其中视图具有对出现的内容的细粒度控制。

页面查看

<asp:Content ID="nav" ContentPlaceHolderID="PagesNavContent" runat="server"> 
    <%= Html.RenderNav(ViewData["PageID"])%> 
</asp:Content> 
+0

我应该说我使用强类型的网页 - 每个视图有一个视图模型我创建。但是,我真的不想为每个ViewModel的pageId添加一个属性。我的意思是,我可以让其他系统(新闻,事件,日历,关于我们公司等)的每个视图在ViewModel中拥有一个pageId = 0,但是我希望能够检测到“我们是否在Pages Controller?使用pageID。否则,使用0“ – Mortanis 2010-06-05 04:32:51

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); 
相关问题