我有其中有一个功能叫GetSiteMap()
母版页,此功能用于定制呈现基于当前位置的地图。我的问题是,在MVC中,你没有模型背后的代码,因此没有公开这种功能。ASP.NET MVC函数调用
什么是做正确的方法是什么?我应该有一个与其中定义的功能的主控页面控制器?
Public Function GetSitemap() As String
Dim s As New SiteNavigation
Dim siteMapNodeCollection As SiteMapNodeCollection
If Not SiteMap.CurrentNode.Equals(SiteMap.RootNode) Then
If Not SiteMap.CurrentNode.HasChildNodes Then
' otherwise it'll go to the pseudo-current directory, which is wrong
Dim parentNode As SiteMapNode = SiteMap.CurrentNode.ParentNode.ParentNode
s.AddBackLink(parentNode.Url, parentNode.Title)
Else
Dim parentNode As SiteMapNode = SiteMap.CurrentNode.ParentNode
s.AddBackLink(parentNode.Url, parentNode.Title)
End If
End If
If Not SiteMap.CurrentNode.HasChildNodes Then
siteMapNodeCollection = SiteMap.CurrentNode.ParentNode.ChildNodes
Else
siteMapNodeCollection = SiteMap.CurrentNode.ChildNodes
End If
For Each siteMapNode As SiteMapNode In siteMapNodeCollection
GenerateLinks(siteMapNode, s)
Next
Return s.GetSiteNavigation()
End Function
Private Sub GenerateLinks(ByRef siteMapNode As SiteMapNode, ByRef siteNavigation As SiteNavigation)
If siteMapNode.Url.Length = 0 And siteMapNode.Description = "separator" Then
siteNavigation.AddSeparator()
ElseIf siteMapNode.Url.Length = 0 And siteMapNode.Description = "heading" Then
siteNavigation.AddHeading(siteMapNode.Title)
Else
siteNavigation.AddLink(siteMapNode.Url, siteMapNode.Description, siteMapNode.Title, siteMapNode.HasChildNodes)
End If
End Sub
对不起,这就是我的意思。我前几天写得很快,所以它不完美,但现在它完成了这项工作。我使用的是站点地图,并给出了某些元素没有网址,而是使用“分隔符”等描述来指示<li>
元素以不同的方式呈现(将不同的类应用于此HTML元素)。
啊是的,我还没有实施任何帮手。可能性是它会触发数据库查询的权限。我还不确定。它实际上只是输出一些HTML。我很快就会对HTML助手产生兴趣。 – Kezzer 2009-04-23 11:53:15
我会重构它,以便它不会生成HTML。在MVC中,这最好留给视图,而不是控制器操作。 HtmlHelpers应该对控制器提供的数据进行操作,而不是进行数据库查询。如果您将DB访问权限构建到帮助程序中,您将会破坏关注点。 – tvanfosson 2009-04-23 12:07:50