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