我正在尝试在使用 SqlServer 会话状态模式配置的应用程序中使用MvcSiteMapProvider。 但是,当我调用 XmlSiteMapController 类的 RegisterRoutes 方法时,我得到一个例外,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
// ...
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
// Add our route registration for MvcSiteMapProvider sitemaps
MvcSiteMapProvider.Web.Mvc.XmlSiteMapController.RegisterRoutes(routes);
}
然后我得到一个例外
键入' System.Web.Routing.RouteValueDictionary'在Assembly&System;系统中,版本= 4.0.0.0,文化=中性, 公钥= b03f5f7f11d50a3a'未标记为可序列化。
这让我觉得MvcSiteMapProvider不支持SqlServer会话状态模式。是吗?
谢谢!
答案 0 :(得分:0)
除非您已对其进行自定义,否则MvcSiteMapProvider
不会以任何方式与会话状态进行交互。因此,它应该适用于任何会话状态模式(我还没有用SqlServer模式测试它,所以如果你继续遇到问题,我建议你打开一个关于它的new issue。有关如何在没有会话状态的情况下工作的说明,请参阅How to Make MvcSiteMapProvider Remember a User's Position。
发布的错误表明您的应用正在尝试序列化System.Web.Routing.RouteValueDictionary
,这不是MvcSiteMapProvider
所做的事情。
另外,只要您安装了XmlSiteMapController.RegisterRoutes
NuGet包,就不需要从MVC 4应用程序中明确调用MvcSiteMapProvider.MVC4
。使用WebActivator自动调用此方法。您可能会通过两次调用来解决问题。
答案 1 :(得分:0)
MvcSiteMapProvider
将需要与状态服务器进行交互。我这样做是为了跟踪我与节点关联的对象,因为MvcSiteMapProvider
会在每次新请求时忘记任何状态信息。
如果您下载代码,则可以将项目添加到解决方案中。
如果你做了替换和
将public class
替换为[System.Serializable]\r\n\public class
同时将public abstract class
替换为[System.Serializable]\r\n\public abstract class
从JavaScriptSerializerAdapter
类中删除该属性。
然后它将可用于状态服务器。