2013-07-16 49 views
0

早上好,我會盡力解釋這個儘可能乾淨。使用不同參數的MVC/JavaScript路由到此操作

頁面爲特定帳戶帶回信息,但有些人可能位於多個帳戶上,我希望提供在它們之間切換的功能。

目前,我有路線設置爲:

{controller}/{action}/{accountcode} 

{accountcode}可以是空的,這在動作檢查,並設置爲默認的代碼。

到目前爲止,我已經得到它做工精細,所以你可以訪問以下網址:

{controller}/{action} OR {controller}/{action}/{accountcode} 

所以我成立了一個下拉列表,讓您可以訪問列表,選擇時它會將您發送到該特定帳戶的網址。

這個效果很好,當我去{controller}/{action}並選擇,因爲它需要window.location.href並附加下拉列表值。

但是,當您在{controller}/{action}/{accountcode}下拉列表重定向到,並且您選擇一個帳戶,它只是試圖追加另一個帳戶代碼,因爲我的破舊的JavaScript邏輯。

我想我正在尋找一種方法來獲取沒有任何參數的當前操作的URL,因此我可以自己定義它們。這是我掙扎的地方,因爲我不能使用Url Helper或Route Helper方法,因爲此功能位於佈局頁面中,這意味着我需要獲取當前頁面的操作。

這裏是我的代碼,希望能提供清晰:

@if ((ViewBag.Accounts ?? new List<string>{"none"}).Count > 1) 
{ 
    @Html.DropDownList("accounts", new SelectList(ViewBag.Accounts, ViewBag.AccountCode)) 
} 

$(function() { 
    $("#accounts").change(function() { 
     window.location.href = window.location.href + "/" + $(this).val(); 
    }); 
}); 

乾杯!

回答

2

但是,當你在{控制器}/{行動}/{accountcode}其中 下拉重定向到,並且您選擇一個帳戶,它只是試圖 追加的,因爲那寒酸的另一個帳戶代碼JavaScript邏輯。

嗯,你可以很容易地通過使用URL傭工解決這個簡陋的邏輯:

<script type="text/javascript"> 
    $(function() { 
     $("#accounts").change(function() { 
      var url = '@Url.Action(null, new { accountcode = "__code__" })'; 
      url = url.replace('__code__', $(this).val()); 
      window.location.href = url; 
     }); 
    }); 
</script> 

,或者如果這是在一個單獨的JavaScript文件,然後簡單地嵌入基本URL作爲HTML 5數據 - *屬性你的下拉菜單:

@if ((ViewBag.Accounts ?? new List<string>{"none"}).Count > 1) 
{ 
    @Html.DropDownList(
     "accounts", 
     new SelectList(ViewBag.Accounts, ViewBag.AccountCode), 
     data_url = Url.Action(null, new { accountcode = "__code__" }) 
    ) 
} 

,然後在單獨的JavaScript文件,只需使用這個值:

$(function() { 
    $("#accounts").change(function() { 
     var url = $(this).data('url'); 
     url = url.replace('__code__', $(this).val()); 
     window.location.href = url; 
    }); 
}); 
+0

光輝的榜樣,謝謝。由於我不知道你可以將null傳遞給Razor Url Helpers以獲得相同的動作,所以我試圖在JavaScript中處理'Request.Url.Segments',讓我得到我想要的東西,我掙扎於此。總而言之,這是一種200%的清潔方法。 – Malkin

+1

對於'data- *'建議+1。無需擔心字符串是否被正確轉義。 – millimoose

0

確保基本URL只有{controller}/{action}值。

window.location = "/Controller/MyAction/" + $(this).val();

或使用Url輔助類:

window.location = "@Url.Action("MyAction")/" + $(this).val();

+0

我會建議不要硬編碼的網址,因爲它顯示在這兩個例子。我會建議使用Url助手代替。 –

+0

爲響應而歡呼,但行動也是未知的(需要動態地發現) – Malkin