[ERROR]目前在此頁面上已停用指定的顯示模式。請確定有啟用目前使用者的個人化。
環境: .NET 4.5
最近公司的系統上到了.NET 4.5之後,原本使用WebPart的功能,卻發生了「目前在此頁面上已停用指定的顯示模式。請確定有啟用目前使用者的個人化。」(The specified display mode is currently disabled on this page. Make sure personalization is enabled for the current user.)錯誤!
查了一下,發現程式一開始是要設定WebPartManager 的 DisplayMode 為 CatalogDisplayMode ,但是因為 User.Identity 沒有驗證過,User.Identity.Name 是空的資料,所以 WebPartManager 的 DisplayMode 就無法切換到 CatalogDisplayMode 。
可以透過以下的Code來看目前 WebPartManager 有 Support 那些 DisplayMode , mgr 為aspx上的 WebPartManager 。
foreach (WebPartDisplayMode mode in mgr.SupportedDisplayModes)
{
string modeName = mode.Name;
Response.Write(string.Format("{0}- IsEnable:{1}:RequiresPersonalization:{2}<br/>"
, modeName, mode.IsEnabled(mgr).ToString(), mode.RequiresPersonalization.ToString()));
}
所以如果 RequiresPersonalization 為 True,表示 WebPartManager 的 Personalization.Scope 要為 User ,不可以是 Shared 。
IsEnabled 為 False,則表示目前 WebPartManager 不能啟用這個 DisplayMode 。
會有這樣的情形是因為系統上是使用 Windows 驗證的方式,然後在 Application_BeginRequest 中去處理驗證問題,所以 User.Identity.IsAuthenticated 是 false 。
而目前的解決就是將web.config中的驗證方式由 Windows 改成 Forms ,這樣就會有 User.Identity 的資料了,詳細可參考「ASP.NET 表單驗證概觀」。
而我們為了權控系統相容,所以AP在驗證時,寫入一個 FormsAuthenticationTicket ,如下,
string userName = "取得驗證過的帳號";
GenericIdentity MyIdentity = new GenericIdentity(userName, User.Identity.AuthenticationType);
String[] MyStringArray = {};
GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray);
HttpContext.Current.User = MyPrincipal;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(userName, false, HttpContext.Current.Session.Timeout);
string encTicket = FormsAuthentication.Encrypt(ticket);
// Create the cookie.
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
Response.Redirect(@"首頁.aspx");
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^