2010-02-02 105 views
1

Short:
有沒有辦法讓路由定義將「CONTROLLER/ACTION」字符串值傳遞給JavaScript函數,而不是實際直行爲控制器行動?MVC:捕獲路由url並將它們傳遞給javascript函數

更多:
我有一個包含網站導航的母版頁。現在,所有頁面都需要隨時包含這個導航,但因爲我不希望導航每次都會不斷加載頁面調用,所以我將所有頁面都改爲了部分瀏覽。 只要在導航中單擊菜單項,就可以通過JQuery.Load()方法加載這些部分視圖。

這一切都工作得很好,直到現在,因爲我注意到這也是網站的要求,能夠直接鏈接到頁面X,而不是default.aspx。

因此,作爲一個例子:
主頁面是我的「default.aspx」頁面,這利用我的母版頁與周圍的導航。每次調用一個新頁面都會使用一個javascript函數,它在我的母版頁中已知的div內加載該特定的局部視圖。所以,這個url永遠不會改變「default.aspx」,但是我的內容似乎變了。

問題是,當直接輸入地址欄時,這些網址也需要可用。但是,它們是部分視圖,因此直接從地址欄加載它們會使它們在其周圍沒有任何主頁的情況下顯示。因此,我的問題是否有可能捕獲輸入到地址欄中的路由並將其傳遞給將在內容div中加載該路由的JavaScript函數。

(我希望我解釋了它足夠好,如果沒有,隨意問的更多信息)

回答

0

第一個挑戰是,當您使用AJAX加載部分頁面時,您需要客戶端可訪問的URL以供javascript調用。第二個挑戰是,您需要加載HomeController並將URL的「頁面」部分傳遞給javascript的URL。

對於第一個方面,我會爲部分頁面創建一些抽象路由,即「/ ajaxaccess/{controller}/{action}/{id}」。那將是第一條註冊路線。第二條路線將接受任何控制器/操作引用,並始終通過HomeController Index操作進行處理。

在/ Home/Index操作中,您獲取請求的URL並對其進行分片,採用/ {controller}/{action}/...部分並使用TempData將其傳遞到default.aspx中。在你的頁面檢查TempData是否存在,如果存在,使用其中的值來觸發你的AJAX頁面加載部分頁面(不要忘記,你需要預先'/ ajaxaccess'(或任何你選擇的)在URL之前它傳遞給你的頁面。

我不會,因爲我認爲你會從通過這一工作獲得的信息將自己前進是非常寶貴的,你在這裏提供的代碼。

+0

我會嘗試這個拉撒路,非常有幫助的'答案'! – 2010-02-03 13:13:51

0

你可以在你的URL中使用哈希錨(#),並用JavaScript讀它。

var url = document.location.toString(); 
if (url.match('#')) { 
    anchor = url.split('#'); 
    // do whatever with anchor[1] .. 
} 
+0

看到,因爲我有很多的不改變頁面的JavaScript調用時,#錨往往會在URL即使它不是「呈現視圖」。所以,雖然這也是我的第一個想法,但在這個發展階段並不是真正的選擇。 – 2010-02-03 13:12:37

0

你可以做這樣的事情,把這個視圖放在你的javascript代碼中:

var szUrl=<%= ViewContext.RouteData.Route.ToString()%>; 

然後當前路由將被存儲在變量szUrl

2

你是100%正確的,不想在你的JavaScript代碼中硬編碼你的URL,因爲它破壞了MVC的主要租戶之一這樣做。我是那些不會在專用.js文件之外編寫單行javascript的「分離關注點」的人之一,所以我不能像tuanvt那樣動態地指定URL。我所做的是使用MVC Url.Action方法將我的服務URL發送到母版頁上的隱藏輸入中(或者如果未在多個位置使用特定頁面)。然後我的腳本文件簡單地從這個隱藏的輸入中抽取出來並且使用它就好了。

ASP.NET MVC查看源

<input id="serviceUrl" type="hidden" value="<%= Url.Action("Action", "Controller") %>" /> 

JS來源

$.getJSON($("#serviceUrl").val(), function(data) { 
    //write your JS success code here to parse the data 
}); 
相關問題