Vb.net 动态Url-MVCSiteMapProvider不工作
我在mvc.sitemap文件中有以下代码(使用mvcsitemapprovider mvc3):Vb.net 动态Url-MVCSiteMapProvider不工作,vb.net,asp.net-mvc-3,mvcsitemapprovider,Vb.net,Asp.net Mvc 3,Mvcsitemapprovider,我在mvc.sitemap文件中有以下代码(使用mvcsitemapprovider mvc3): 我还调用此函数来添加面包屑: <MvcSiteMapNode(Title:="Edit", ParentKey:="InternalMailCalendar")> _ Function Edit(ByVal id As Integer) As ActionResult If id > 0 Then Dim obj = Mappe
我还调用此函数来添加面包屑:
<MvcSiteMapNode(Title:="Edit", ParentKey:="InternalMailCalendar")> _
Function Edit(ByVal id As Integer) As ActionResult
If id > 0 Then
Dim obj = Mapper.Map(Of InternalMailCalendarViewModel)(_repositoryForIntMailCalendar.FindSingleByCondition(Function(x) x.ID = id))
If obj IsNot Nothing Then
Return View(obj)
End If
End If
Throw New HttpException(404, "Invalid Calendar ID")
End Function
_
函数编辑(ByVal id为整数)作为ActionResult
如果id>0,则
Dim obj=Mapper.Map(内部MailCalendarViewModel的)(_repositoryForIntMailCalendar.FindSingleByCondition(函数(x)x.ID=ID))
如果obj不是什么,那么
返回视图(obj)
如果结束
如果结束
抛出新的HttpException(404,“无效日历ID”)
端函数
但是,面包屑中没有任何内容仅显示此动态url。有什么想法吗?要使用自定义参数(如“id”),必须配置MvcSiteMapProvider以将其考虑在内。有2个选项—您可以为每个控制器操作配置1个节点(如您所做的),也可以为每个路由值组合配置1个节点(在您的情况下,每个id配置1个节点)
有一篇关于这个主题的详细文章,可下载的演示名为。这两个答案也可能有帮助
<mvcSiteMapNode title="Home" controller="Home" action="Index" key="Home">
<mvcSiteMapNode title="Internal Mail Delivery Days" controller="InternalMailCalendar" action="Index" key="InternalMailCalendar">
<mvcSiteMapNode title="Create" controller="InternalMailCalendar" action="Create" visibility="SiteMapPathHelper,!*"/>
<mvcSiteMapNode title="Details" controller="InternalMailCalendar" action="Details" visibility="SiteMapPathHelper,!*" preservedRouteParameters="id">
<mvcSiteMapNode title="Edit" controller="InternalMailCalendar" action="Edit" visibility="SiteMapPathHelper,!*" preservedRouteParameters="id"/>
<mvcSiteMapNode title="Delete" controller="InternalMailCalendar" action="Delete" visibility="SiteMapPathHelper,!*" preservedRouteParameters="id"/>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
如果使用外部DI,则可以分别在SiteMapNodeVisibilityProviderStrategy和SiteMapBuilderSet的构造函数上配置这些设置
// Visibility Providers
this.For<ISiteMapNodeVisibilityProviderStrategy>().Use<SiteMapNodeVisibilityProviderStrategy>()
.Ctor<string>("defaultProviderName").Is("MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider");
// Configure the builder sets
this.For<ISiteMapBuilderSetStrategy>().Use<SiteMapBuilderSetStrategy>()
.EnumerableOf<ISiteMapBuilderSet>().Contains(x =>
{
x.Type<SiteMapBuilderSet>()
.Ctor<string>("instanceName").Is("default")
.Ctor<bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
.Ctor<bool>("enableLocalization").Is(enableLocalization)
.Ctor<bool>("visibilityAffectsDescendants").Is(false)
.Ctor<bool>("useTitleIfDescriptionNotProvided").Is(useTitleIfDescriptionNotProvided)
.Ctor<ISiteMapBuilder>().Is(builder)
.Ctor<ICacheDetails>().Is(cacheDetails);
});
//可见性提供程序
this.For().Use()
.Ctor(“defaultProviderName”).Is(“MvcSiteMapProvider.FilteredItemsNodeVisibilityProvider,MvcSiteMapProvider”);
//配置生成器集
this.For().Use()
.EnumerableOf().Contains(x=>
{
x、 类型()
.Ctor(“instanceName”).Is(“默认值”)
.Ctor(“securityTrimmingEnabled”).Is(securityTrimmingEnabled)
.Ctor(“enableLocalization”).Is(enableLocalization)
.Ctor(“可视性影响搜索者”).Is(假)
.Ctor(“useTitleIfDescriptionNotProvided”).Is(useTitleIfDescriptionNotProvided)
.Ctor().Is(生成器)
.Ctor().Is(缓存详细信息);
});
标题
最后但并非最不重要的一点是,我们需要修复节点的标题,以便在每次切换记录时它都会更改。这将确保我们在breadcrumb中看到当前记录的名称或标题,而不是在XML的title属性中设置的名称或标题
实现这一点的最简单方法是使用SiteMapTitleAttribute。此属性只能添加到动作方法中
<SiteMapTitle("Name", Target = AttributeTarget.ParentNode)> _
Function Edit(ByVal id As Integer) As ActionResult
If id > 0 Then
Dim obj = Mapper.Map(Of InternalMailCalendarViewModel)(_repositoryForIntMailCalendar.FindSingleByCondition(Function(x) x.ID = id))
If obj IsNot Nothing Then
Return View(obj)
End If
End If
Throw New HttpException(404, "Invalid Calendar ID")
End Function
_
函数编辑(ByVal id为整数)作为ActionResult
如果id>0,则
Dim obj=Mapper.Map(内部MailCalendarViewModel的)(_repositoryForIntMailCalendar.FindSingleByCondition(函数(x)x.ID=ID))
如果obj不是什么,那么
返回视图(obj)
如果结束
如果结束
抛出新的HttpException(404,“无效日历ID”)
端函数
本例假设您的模型(变量obj)有一个名为“Name”的属性。该属性可以根据需要命名,只需与SiteMapTitle属性的配置匹配即可。第二个参数表示我们希望当前节点的父节点更改标题。请记住,在上面的示例中,我们希望编辑面包屑如下所示:
主页>内部邮件投递天数>记录1>编辑
换句话说,我们不希望编辑节点的标题更改,我们希望显示“Record 1”的标题更改为当前记录的名称。只需确保在Details节点中不使用Target参数,因为在该节点上,我们需要动态更改当前标题,而不是父节点
重要提示
使用PreservedLoteParameters有一个您需要注意的副作用——它将“id”从当前请求复制到配置它的所有可见节点中。可以重用路由值“id”,只要它对所有可见的节点都意味着相同的内容。如果要同时显示另一级别的节点,并且这些节点需要一个参数,则必须将其命名为与原始参数不同的名称(在本例中为“id”),以便将这些值分开
此外,您必须(手动)确保生成所有可见URL所需的所有值都在每个请求的URL中可用,即使这意味着在URL中粘贴应用程序不需要的额外信息。谢谢您的回复。我所有的控制器都存在于主MVC项目中。useexternaldicontainer设置为false,ScanAssembliesForItemsNodes设置为true,includeassembliesforscan设置为正确的程序集。你觉得我还缺什么吗?因为我已经做了这些改变,但仍然不起作用。我现在甚至在这个问题上设置了悬赏。我卸载了sitemapprovider并重新安装了它,现在它抛出了一个关于名称空间的错误。我正在使用vb.net,它引入了cshtml模板,我需要将它们转换为vbhtml吗?我不完全确定您是否需要转换模板,但这样做不会有什么坏处。不过,我认为名称空间问题与此无关。确保已安装依赖项mvcsitemprovider.Core和(特别是)mvcsitemprovider.Web
// Visibility Providers
this.For<ISiteMapNodeVisibilityProviderStrategy>().Use<SiteMapNodeVisibilityProviderStrategy>()
.Ctor<string>("defaultProviderName").Is("MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider");
// Configure the builder sets
this.For<ISiteMapBuilderSetStrategy>().Use<SiteMapBuilderSetStrategy>()
.EnumerableOf<ISiteMapBuilderSet>().Contains(x =>
{
x.Type<SiteMapBuilderSet>()
.Ctor<string>("instanceName").Is("default")
.Ctor<bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
.Ctor<bool>("enableLocalization").Is(enableLocalization)
.Ctor<bool>("visibilityAffectsDescendants").Is(false)
.Ctor<bool>("useTitleIfDescriptionNotProvided").Is(useTitleIfDescriptionNotProvided)
.Ctor<ISiteMapBuilder>().Is(builder)
.Ctor<ICacheDetails>().Is(cacheDetails);
});
<SiteMapTitle("Name", Target = AttributeTarget.ParentNode)> _
Function Edit(ByVal id As Integer) As ActionResult
If id > 0 Then
Dim obj = Mapper.Map(Of InternalMailCalendarViewModel)(_repositoryForIntMailCalendar.FindSingleByCondition(Function(x) x.ID = id))
If obj IsNot Nothing Then
Return View(obj)
End If
End If
Throw New HttpException(404, "Invalid Calendar ID")
End Function