我尝试在javascript中使用带有动态字符串的URLHelp.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 :(得分:3)
这不起作用。在html页面到达浏览器之前,Razor语法呈现。 Javascript执行后。
因此,您尝试使用第2步填充第1步。
function MyFun(action, param){
Windows.Location ="/MyController/" + action + "?param1=" + param;
}
答案 1 :(得分:2)
尝试使用此代码
function MyFun(action, param){
Windows.Location.href ="/MyController/" + action + "?param1=" + param;
}
答案 2 :(得分:0)
一旦代码离开服务器,就无法动态地将剃刀代码添加到视图中...... Razor不会在客户端浏览器上编译。
您可以使用jQuery并对Controller / Action进行$ .ajax()调用,其唯一目的是返回一个URL:
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);
}
在$ .ajax回调中,设置Windows.Location.href = response; (将此javascript放在razor .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; }
}
}
答案 3 :(得分:0)
我最终获得了一个获取整个网址的功能 -
函数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;
}