【问题标题】:ASP.NET MVC RouteUrl with dynamic action具有动态操作的 ASP.NET MVC RouteUrl
【发布时间】:2013-02-13 03:48:43
【问题描述】:

我尝试在 javascript 中使用带有动态字符串的 URLHelp.RouteUrl。我要这样-

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

它不起作用。我错过了什么吗?我们在 ASP.NET MVC 中是否有替代方法以类似的方式工作?

谢谢,

附加信息 -

我尝试上述方法是因为我的应用程序有问题 - 当我使用 "Windows.Location.href ="MyController/MyAction" 时,主页有 "http://myserver/myapplicaiton/mycontroller/myaction" 正确返回。但是下一页出现了双控制器"http://myserver/myapplication/mycontroller/mycontroller/myaction"
是什么导致了这个路由问题?

【问题讨论】:

    标签: javascript asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 asp.net-mvc-4


    【解决方案1】:

    这行不通。 Razor 语法在 html 页面到达浏览器之前呈现。 Javascript 之后执行。

    因此,您正在尝试使用步骤 2 填充步骤 1。

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

    【讨论】:

    • @Don,我查看了您的示例,您使用的是“Windows.Location.href ="MyController/MyAction"。这与“Windows.Location ="/MyController/MyAction" 不同" 请注意,添加前导 '/' 并删除 'href' 应该导致 MVC 框架使用网站根目录
    • 感谢您的回复。那并没有解决我的问题。部署到服务器后,它返回“myserver/mycontroller/myaction”而没有“/myapplicaiton”。它在 Visual Studio 2010 中工作,但在部署后不能。
    • @Don,你有什么特别的路线吗?如果是这样,请将它们包含在您的答案中。否则,我建议使用重定向操作方法,您将向其传递操作和控制器
    【解决方案2】:

    试试这个代码

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

    【讨论】:

    • 这就是我正在使用的。但是这种方式无法正确解析我的网站根目录。我想要一种类似于 URL.Content("~/") 的方式来获取正确的路径。
    • 尝试使用 "~/MyController/" + action + "?param1=" + param
    • @Don,我很欣赏你遵循最佳实践的冲动,但你不能动态使用 Url.Content。在 JS 启动之前,所有 Razor 语法都已预渲染。但是,即使这不是最佳实践,也不要害怕使用简单的字符串路径。像这样的动态行为需要稍微弯曲一下约定。
    • @Don,我认为 IC,您需要一种解决相对根目录的方法。 MVC 路由引擎对你来说不够用吗?
    • @Dave A,你是对的。我不知道如何使路由工作。我在我的问题中添加了信息。谢谢
    【解决方案3】:

    一旦代码离开服务器,您就无法将 razor 代码动态添加到视图中... Razor 未在客户端浏览器上编译。

    您可以使用 jQuery 并调用 $.ajax() 来调用 Controller/Action,其唯一目的是为您返回一个 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; }
                }
    }
    

    【讨论】:

    • 使用 Ajax 绝对是个好主意。我急于完成使用常规 javascript。我稍后会尝试你的方法。谢谢
    【解决方案4】:

    我最终得到了一个获取整个 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2017-01-04
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多