要學會使用CascadingDropDown,建議先看過Sample網站所附網頁的Source Code。而在嘗試的過程中,可能會遇到些小問題,以下就列出幾處讓我跌倒的地方:

  1. 如果你想借用Sample中的QuerySimpleCascadingDropDownDocument,XML NodeName記得用小寫。
    因為Source Code中有這行"xpath += ("/" + category.ToLowerInvariant());",害我追了好久。
  2. 在測試CascadingDropDown時,你可能會不時遇到以下的錯誤,多半發生在由其他Control觸發PostBack時。原則上只要將Page的EnableEventValidation設為False就OK了。

    Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

    【技術細節】EnableEventValidation主要是用來防止Injection攻擊。例如: 有個DropDownList明明只有user1, user2, user 3三個選項,但被人用Client Side Script增加了第四個選項administrator,EnableEventValidation就可以攔下這種變造的攻擊。不過,CascadingDropDown看來也在做"變造"下拉選項的工作,因此也被攔了下來,要讓動態改變的選項值合法化的步驟挺麻煩的,個人認為可行性不高,所以針對特定網頁在Page中將EnableEventValidation停用似乎較合理。(這種問題打打小洞就好了,千萬不要自暴自棄地在web.config中停用全網站的Event Validation) 如果有興趣對這個議題多一些了解,這裡有一篇好文章

  3. WebMethod似乎會被Server端Cache住,有幾次經驗,明明WebMethod的內容已經修改,但CascadingDropDown取回的卻一直是修改後的值,即使我用IE Dev Helper Toolbar Disable Cache或是加上亂數QueryString都是如此。最後得靠重啟Web Application(不一定要IISRESET,將web.config重新存檔即可)才解決。
  4. WebMethod的Code是以static method的方式存在,除了傳入的參數,沒辦法與呼叫端的ASPX溝通,我用了點小技巧,透過HttpContext.Current.Request.UrlReferrer取得呼叫網頁的URL,可以解決了一部份需求。

Comments

# by KIM

Good Article

# by jeff

請問一下..偶運作正常..但想在來源可以傳入參數得到不同內容. 如:A登入..就是A的選單資料..B登入..就是B的選單資料..來源都是同一個Table ... CascadingDropDown 所制定的method 不能填入 id 的數數.(不是指第二層接受第一層的參數,,這是CascadingDropDown本來就是的),

# by jeff

請問一下..偶運作正常..但想在來源可以傳入參數得到不同內容. 如:A登入..就是A的選單資料..B登入..就是B的選單資料..來源都是同一個Table ... CascadingDropDown 所制定的method 不能填入 id 的數數.(不是指第二層接受第一層的參數,,這是CascadingDropDown本來就是的),

# by edison

原來設EnableEventValidation可以解決 web.config中的Event Validation 我也不想改

Post a comment


37 + 6 =