Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 动态Url-MVCSiteMapProvider不工作_Vb.net_Asp.net Mvc 3_Mvcsitemapprovider - Fatal编程技术网

Vb.net 动态Url-MVCSiteMapProvider不工作

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

我在mvc.sitemap文件中有以下代码(使用mvcsitemapprovider mvc3):


我还调用此函数来添加面包屑:

<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个节点)

有一篇关于这个主题的详细文章,可下载的演示名为。这两个答案也可能有帮助

积垢的例子 但这是读者文摘的版本。对于仅对登录用户可用的CRUD操作(没有搜索引擎会看到),最好的方法是使用PreservedLoteParameters强制一组节点匹配每个记录

构造节点 第一件事。让我们做一个完整的例子,包括索引、详细信息、创建、编辑和删除,只是为了概述如果您使用它们,它们将走向何方。当然,您可以将实现限制为所需的功能,如果愿意,您可以将其更改为使用MvcSiteMapNodeAttribute。但我在这里用XML显示它们,这样它们更容易在您的脑海中描绘出来。第一件事是适当地安排节点,这样您的面包屑轨迹将正确地显示当前位置

<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