2011-03-07

ASP.NET Slideshowextender Using WebService

下載AjaxControlToolkitSampleSite的範例網站就可以看到完整範例
照著用也都非常的ok,也應用到前個案子上面,輕鬆愉快。

問題是現在著手的新案子,PM要求也要使用Slide Show的方式,
筆者馬上答應,沒想到才是痛苦的開始,先說說問題點
AjaxControlToolkitSampleSite的範例網站的使用方式是用在
Codebeside裡面,假設你的網頁叫Menu.aspx那Slide Show的Ajax是寫在Menu.aspx.vb
卡點一:
因為筆者本身有使用UrlRewritingNet.UrlRewriter.dll為的就是SEO優化
會自動把MENUS.aspx?mm_Id=4&smt=1轉成是MENUS_SOUP.aspx
也就是二者是相通的,然後在Codebeside用到Request.Query("mm_Id")和Request.Query("mm_Id")
一執行MENUS_SOUP.aspx,馬上報錯,可是執行MENUS.aspx?mm_Id=4&smt=1確可以
網頁上一切正常,可是用Fiddler查看Url居然會自動加料變成MENUS.aspx?mm_Id=4&smt=1/GetSlides
本來想放棄直接使用MENUS.aspx?mm_Id=4&smt=1帶參數的方式表現時,另一個問題又來了
卡點二:
要把Slide Show放入Repeater裡面,假定有三筆資料,每筆資料裡面又有自己的圖,而且圖都要變換,有可能是第一筆資料有5張圖,第二筆料有10張圖,第三筆資料有7張圖。
PM想要的就是每資料內的Slide Show,

解法:
一定要用Web Service了,而且是要帶參數的
取一個MenuPhotoWebService.asmx

<%@ WebService Language="VB" Class="MenuPhotoWebService" %>
Imports System
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Linq
Imports AjaxControlToolkit

_
_
_
_
Public Class MenuPhotoWebService
Inherits System.Web.Services.WebService

_
Public Function GetSlides(ByVal contextKey As String) As AjaxControlToolkit.Slide()
Dim db As New vb.StarryNightDataClassesDataContext()
Dim mp = (From p In db.Menus_Photo _
Where p.mp_sm_Id = CType(contextKey, Integer) _
Select p).ToList()
If mp IsNot Nothing Then
Dim result As AjaxControlToolkit.Slide() = New AjaxControlToolkit.Slide() {}
Array.Resize(result, mp.Count)
Dim i As Integer = 0
For Each m In mp
result(i) = New AjaxControlToolkit.Slide("images/Menus/S" + m.mp_img_Name, "", "")
i += 1
Next
Return result
End If
Return Nothing
End Function

End Class

前端頁面如下

〈asp:Repeater ID="rpt_menu_detail" runat="server" DataSourceID="ods_menu_details"〉
〈ItemTemplate〉
〈asp:Image ID="imgLeft" ImageAlign="AbsMiddle" runat="server" CssClass="img-l" /〉
〈ajaxToolkit:SlideShowExtender ID="SlideShowExtenderLeft" runat="server" TargetControlID="imgLeft" SlideShowServiceMethod="GetSlides"
UseContextKey="true" ContextKey='〈%#Eval("sm_Id")%〉' SlideShowServicePath="~/MenuPhotoWebService.asmx" AutoPlay="true"
Loop="true" /〉
〈/ItemTemplate〉
〈/asp:Repeater〉


重點是 UseContextKey ContextKey 看出來了嗎^^

0 comments: