2012年3月28日 星期三

[射茶包]千呼萬喚不出來的CascadingDropDownList


要使用這個Ajax呢,需要以下工具

一個Visual Studio 2010可以用而且有裝AjaxToolToolkits
一個以上資深而且有研究過CascadingDropDownList的前輩
(非必要,但有了他會加快編程速度)



如果什麼東西都沒有,可以先在這裡看一下範例
基本上CascadingDropDownList大部分都是搭配WebMethod...
因為從設定到可以用蠻麻煩的,所以當然希望一隻程式可以跑到天荒地老都不要換
這樣的話寫成.asmx比較能夠重複使用,當然要寫在單頁也可以啦
只是...如果你夠有耐心看到最後會覺得...

如果沒有必要用很多次的東西,用一般DriopDownList + UpdatePanel就好了
反正看起來差不多...
以使用者的角度,CascadingDropDownList看起來會比較像是加速版的DriopDownList ...

越扯越離題

那開始吧~要用CascadingDropDownList一定要有DriopDownList ...
(我想應該不會有人很天真的只用CascadingDropDownList吧..有的話拜託留一下言我好想認識你!
從工具箱把DriopDownList 拖出來,然後為他取個可愛的小名,嗯盡量還是讓他有意義一點啦

提到名字不由得想起之前看到的笑話--軟體業的重要職缺 命理大師!


    <asp:DropDownList ID="ddl_test" runat="server">
    </asp:DropDownList>

又離題了,然後把CascadingDropDownList也弄出來...
這個部份是我第一個卡住的點,因為我找不到放在哪...
沒關係我的Blog不鎖右鍵整個貼過去用就好
寫網誌就是為了不要讓大家跟我一樣寫個程式卡死老半天嘛(笑

     <asp:CascadingDropDown ID="ddl_test_CascadingDropDown" runat="server"
        SelectedValue="N"
        Enabled="True"
        LoadingText="Loading..."
        ServicePath="~/xxxx.asmx"
        ServiceMethod="GetLV1"
        Category="LV1"
        TargetControlID="ddl_test">
    </asp:CascadingDropDown>

   <asp:DropDownList ID="ddl_test2" runat="server">
    </asp:DropDownList>
      <asp:CascadingDropDown ID="ddl_test2_CascadingDropDown" runat="server"
        Enabled="True"
        SelectedValue="N"
        Category="LV2"                  
        LoadingText="Loading...."
        ServicePath="="~/xxxx.asmx"
        ServiceMethod="GetLV1LV2"
        ParentControlID="ddl_test"
        TargetControlID="ddl_test2">
    </asp:CascadingDropDown>

拖個兩個可以做連動~後面依此類推阿~
接著要做一些相關設定...這邊很重要阿注意聽!!!
我就是沒看好所以在這邊卡了半天不能用!

Enabled="True"
//讓這個DDL可不可以選

SelectedValue="N"
//讓這個DDL有沒有預設值,這邊是設定"N"

Category="LV2"
 //類別名稱                  
LoadingText="Loading...."
//如果資料量很大,程式在塞資料的時候要顯示什麼在DDL裡面避免可愛又無知的User又以為我們的系統掛了

ServicePath="="~/xxxx.asmx"
//WebMethod那頁放的地方,可以考慮用 ~/ 、../../、../之類的,反正程式找不到就會幫你劃上綠色底線提醒了

ServiceMethod="GetLV1LV2"
//在WebMethod那頁,是哪個方法要作用在這個DDL

ParentControlID="ddl_test"
//他上層的DDL,注意阿不是上層分類名稱,是上層作用的DDL

TargetControlID="ddl_test2"
//這個CascadingDropDownList要控制哪個DDL

這些屬性最好可以一個不少的全部用上
因為CascadingDropDownList其實屬性更多,但這些基本的沒宣告就不能用了阿
我用ddl_test2來說明,要是連ddl_test都不能動....

「資料面,或是傳入參數的問題」

資深的前輩這樣講,所以在參數的地方建中斷點吧,如果你是偷師前輩的代碼,記得看一下各個頁面的,aspx, .cs, .asmx, .asmx.cs 這幾個Namespace有沒有一致,這個如果不一樣的話就會跑不出來,一邊看網誌一邊寫程式的話...還不快檢查(巴頭

不檢查就等著看到Method Error 500/12030/12031!
尤其是WebMethod的前台.asmx不經意真的會忽略過去阿!

接著下一個錯大概是這個

"Microsoft JScript 執行階段錯誤: Sys.WebForms.PageRequestManagerServerErrorException: 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."

這個比較簡單,在aspx那頁最上面加下面這句就好....不是要你把前面那些CodeBehind, Inherits統統刪掉阿!!用加的!!
<%@ Page EnableEventValidation= "false " %>
統統刪掉我也不知道會怎樣,頂多也是不能動吧...

對了,WebMethod也會出一些問題,像是忘記要引用這個
using System.Web.Script.Services;
或是忘記在方法前加這個
[System.Web.Script.Services.ScriptService]
當然每一個方法前面都還要這個,每一個都要喔...
[WebMethod(EnableSession = true)]或[WebMethod]

這都是血與淚換來的經驗阿...這裡寫的每一個卡點都是我卡住至少10分鐘的地方嗚嗚
Google好用但是集中把問題解完的網頁可以說是沒有..



更多參考
這個人用C#寫得
但程式沒剪下來跑過我也不知道會有多少卡點

更多問題

或者,你也可以考慮留下你的問題以及跟我講怎樣的寫法會有這個問題
我可以幫忙試試~

沒有留言:

張貼留言