2014-08-28 48 views
1

我正在使用與地圖相關的GIS地圖功能的第三方控件。 我有需要從JavaScript內調用C#方法。我選擇使用PageMethods這樣的:當你轉換你的方法爲[WebMethod]在WebMethod內部強制回發

在這種方法中,我通過在鼠標的座標

PageMethods.getFeature(x,y) 

就像一個魅力,只要它返回我的地圖特徵。我會在地圖上突出顯示。

從研究我發現你不能直接從[WebMethod]內部訪問UI,所以我決定設置一個會話變量和回發。如果會話變量存在,回發時我會進行必要的UI更改。

WebMethod看起來是這樣的:

[WebMethod(EnableSession = true)] 
     public static void getFeature(float x, float y) 
     {... 
     some code in here. 
     } 

更新 這是我的jQuery:

<script> 
     $(document).ready(function (e) { 
      $(".MyMap").click(function (e) { 
       var posX = $(this).position().left; 
       var posY = $(this).position().top; 
       PageMethods.getFeature(e.pageX-posX, e.pageY-posY); 
       }); 
     }); 
    </script> 

如何強制WebMethod內回傳。我知道回發的大多數方式都不起作用。

+0

您不能讓瀏覽器將表單發送到服務器,從服務器河這是客戶端操作。您可以編寫JavaScript,當它從Web服務接收到響應時導致回發。 – 2014-08-28 14:47:01

+0

@ BenRobinson這是一個好點...嗯。 javascript用於獲取MouseClick事件並知道圖像被點擊的位置。這傳遞給了C#中的方法。有沒有另一種方法來實現這一點,而不使用'WebMethod'。我正在使用jQuery的JavaScript函數。 – logixologist 2014-08-28 14:52:27

+0

作爲jQuery ajax調用的結果,您希望發生什麼? MVC和Web API控制器也可以處理Ajax請求,Web API特別強大且靈活。 – 2014-08-28 14:54:39

回答

0

特別感謝@BenRobinson幫助我走向正確的方向。這是我想出來的。我將這張貼發佈給其他可能犯類似錯誤的人。簡短的回答是:**你不能回覆

我的主要問題是我使用的是[WebMethod],所以我的c#代碼可以從jQuery調用。這工作完美,直到我需要訪問用戶界面。技術上來說,'WebMethod'幾乎就像調用Web服務一樣。你不能有一個遠程Web服務更新用戶界面。你可以做的是在你的jQuery運行函數調用[WebMethod]之後,讓它調用一個新頁面(window.location)。該位置可以調用原始頁面(在我的情況下是Default.aspx)。我在請求字段中傳遞了需要發送給UI的參數,而且我基本上把代碼放在那裏,如果在加載時看到一個特定的請求變量,然後做一些事情......它就像一個魅力。

這裏有一個粗略的例子: 在我的jQuery的頁面我這樣做(導航到一個新的頁面):

window.location.replace("ZoomAndCenter.aspx?x=" + (e.pageX - posX) + "&y=" + (e.pageY - posY)) 

這裏是我的ZoomAndCenter.aspx樣子:

protected void Page_Load(object sender, EventArgs e) 
      { 
       int x = 0; 
       double y = 0; 
       x = Int32.Parse(Request["x"].ToString()); 
       y = Double.Parse(Request["y"].ToString()); 
       //Run some more code 
       Response.Redirect("Default.aspx?Param1=xxxx&Param2=xxxx"); 
       //passed the params in the redirect. 
      } 

然後在Default.aspx中

if(request["param1"] == "something") 
{ 
//do something 
}