[ERROR]目前在此頁面上已停用指定的顯示模式。請確定有啟用目前使用者的個人化。

[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.)錯誤!

image

 

查了一下,發現程式一開始是要設定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:從零開始的軟體開發生活

請大家繼續支持 ^_^