0

我嘗試在javascript中使用帶動態字符串的URLHelp.RouteUrl。我想這樣 -帶動態動作的ASP.NET MVC RouteUrl

function MyFun(action, param){ 
    var strPass = "MyController/" + action + "?param1=" + param; 
    Windows.Location.href = "<%=Url.RouteUrl(" + strPass + ")%>"; 
} 

它不起作用。我錯過了什麼?我們有沒有其他的方式在ASP.NET MVC中以類似的方式工作?

感謝,

其他信息 -

我嘗試了上面的方法,因爲我從我的應用程序的問題 - 主要頁面有"http://myserver/myapplicaiton/mycontroller/myaction"當我使用"Windows.Location.href ="MyController/MyAction"正確返回。但有雙控制器的下一頁出現"http://myserver/myapplication/mycontroller/mycontroller/myaction"
導致此路由問題的原因是什麼?

回答

0

我結束了一個函數來獲取整個URL -

功能FullURL(){

var app = "<%=HttpRuntime.AppDomainAppVirtualPath.ToString()%>"; 

if (app == "/") 
    app = ""; 

return location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '') + app; 

}

然後從稱之爲 -

function MyFun(action, param){   
     Windows.Location =FullURL() + "/MyController/" + action + "?param1=" + param; 
    } 
2

試試這個代碼,而不是

function MyFun(action, param){   
     Windows.Location.href ="/MyController/" + action + "?param1=" + param; 
    } 
+0

這就是我正在使用的。但這種方式無法正確解析我的網站根目錄。我想要一種類似於URL.Content(「〜/」)的方式來獲取正確的路徑。 – Don 2013-02-13 04:14:45

+0

嘗試使用「〜/ MyController /」+ action +「?param1 =」+ param – Cris 2013-02-13 04:17:12

+2

@Don,我很佩服您遵循Best Practice的願望,但您無法動態使用Url.Content。所有Razor語法都是在JS啓動之前預渲染的。但是,即使這不是最佳實踐,也不要害怕使用簡單的字符串路徑。像這樣的動態行爲需要稍微彎曲慣例。 – 2013-02-13 04:17:28

3

這可不行。在html頁面到達瀏覽器之前的Razor語法渲染。 JavaScript執行後。

所以,你想填充步1步2

function MyFun(action, param){   
     Windows.Location ="/MyController/" + action + "?param1=" + param; 
    } 
+0

@Don,我看了你的例子,並且你正在使用「Windows.Location.href =」MyController/MyAction「,這與」Windows「不一樣。Location =「/ MyController/MyAction」請注意,添加領先的**'/'**和刪除**'href'**應該引導MVC框架使用網站根目錄 – 2013-02-13 12:35:37

+0

感謝您的回覆。這並沒有解決我的問題。在部署到服務器後,它會返回「http:// myserver/mycontroller/myaction」而不帶「/ myapplicaiton」。它在Visual Studio 2010中工作,但不在部署之後。 – Don 2013-02-13 15:37:52

+0

@唐,你有沒有使用特殊路線?如果是的話,請把它們包括在你的答案中。否則,我建議使用重定向操作方法,您將通過該操作並使用Ajax控制器 – 2013-02-13 15:39:59

0

您不能動態剃刀代碼添加到一個視圖一旦代碼離開服務器...剃鬚刀不是編譯客戶端瀏覽器。

您可以使用jQuery和做出$。阿賈克斯()調用到控制器/動作具有回你一個網址的唯一目的:

public ActionResult GenerateUrlFromRoutingEngine(string ControllerName, string ActionName, string RouteValues) 
{ 
    var ctx = new HttpContextWrapper(HttpContext.Current); 
    UrlHelper helper = new UrlHelper(
          new RequestContext(ctx, 
          RouteTable.Routes.GetRouteData(ctx)); 
    var returnUrl = helper.Action(ControllerName,ActionName, RouteValues); //TODO: transform RouteValues to RouteValuesDictionary 
    return Content(returnUrl); 
} 

在$就回調,將Windows .Location.href = response; (把這個JavaScript在剃刀.cshtml文件或找到一種方法,在URL通過直觀。)

function MyFun(action, param){ 
    $.ajax({ 
      type: "POST", 
      url: "@{Html.RouteLink("GenerateUrlFromRoutingEngine", "MyController")}", 
      data: { ControllerName: 'MyController', ActionName: action, RouteValues: param }, 
      dataType: "text", 
      success: function(response) { Windows.Location.href = response; } 
      } 
} 
+0

絕對是一個好主意。我正忙着完成使用常規的JavaScript。我會稍後嘗試你的方式。謝謝 – Don 2013-02-14 02:59:30