如何在@Url.Action 中传递动态值?

Posted

技术标签:

【中文标题】如何在@Url.Action 中传递动态值?【英文标题】:How to pass dynamic value in @Url.Action? 【发布时间】:2013-04-09 18:46:38 【问题描述】:

我在部分视图中编写了以下 jquery:

    $.ajax(
        type: "POST",
        url: '@Url.Action("PostActionName", "ControllerName")',
        data:  Id: "01" ,
        success: function(data)
            
            if (data.success="true")
                
                    window.location = '@Url.Action("GetActionName", "ControllerName")'
                
            
    );

动作名称和控制器名称不是固定的,它们必然会根据放置此局部视图的视图而改变。我有获取调用动作和控制器名称的函数,但不确定如何在 @Url.Action 中传递它们。

以下是获取动作和控制器名称的 javascript 函数:

function ControllerName() 
            var pathComponents = window.location.pathname.split('/');
            var controllerName;
            if (pathComponents.length >= 2) 
                if (pathComponents[0] != '') 
                    controllerName = pathComponents[0];
                
                else 
                    controllerName = pathComponents[1];
                
            
            return controllerName;
        

        function ActionName() 
            var pathComponents = window.location.pathname.split('/');
            var actionName;
            if (pathComponents.length >= 2) 
                if (pathComponents[0] != '') 
                    actionName = pathComponents[1];
                
                else 
                    actionName = pathComponents[2];
                
            
            return actionName;            
        

【问题讨论】:

您当前将两个字符串传递给Url.Action。它们很可能是变量。 “不是固定的,它们必然会改变”——值从何而来? 由于@Url.Action 是一个MVC 助手,创建一个变量对我没有帮助.. 【参考方案1】:

我有获取调用动作和控制器名称的函数,但是 不知道如何在@Url.Action 中传递它们

嗯,你可以调用这些函数。例如,如果它们是 UrlHelper 类的扩展方法:

window.location = '@Url.Action(Url.MyFunction1(), Url.MyFunction2())'

或者如果它们只是静态函数:

window.location = '@Url.Action(SomeClass.MyFunction1(), SomeClass.MyFunction2())'

另一方面,如果需要传递的值只有客户端知道,您可以执行以下操作:

var param = 'some dynamic value known on the client';
var url = '@Url.Action("SomeAction", "SomeController", new  someParam = "__param__" )';
window.location.href = url.replace('__param__', encodeURIComponent(param));

更新:

您似乎只是想获取当前的控制器和可以这样实现的操作:

@
    string currentAction = html.ViewContext.RouteData.GetRequiredString("action");
    string currentController = Html.ViewContext.RouteData.GetRequiredString("controller");

然后:

window.location.href = '@Url.Action(currentAction, currentController)';

【讨论】:

我忘了提,它们是 javascript 函数。查看编辑以查看这些函数。 感谢 Darin 的详细回答,但是,我不确定您所说的“SomeAction”和“SomeController”是什么意思。这应该是目标动作的名称吗?还是应该是动态的? 您似乎正在尝试获取当前操作和控制器。请参阅我更新的示例,不要为此使用 javascript。 这就像一个魅力。这正是我想要的。非常感谢达林。 @DarinDimitrov - 正如你所建议的那样, var param = 'some dynamic value known on the client'; var url = '@Url.Action("SomeAction", "SomeController", new someParam = "param" )'; window.location.href = url.replace('param', encodeUriComponent(param));。这里我们为什么不直接将变量 param 传递给 Url.action()?你能解释一下吗?【参考方案2】:

你尝试过这样的事情吗?我自己没有尝试过,但应该可以。

var dataToSend = "01";
var url = '/controllerName/actionName/' + dataToSend;
var actionName = ActionName();
var controllerName = ControllerName();
url.replace("actionName",actionName);
url.replace("controllerName",controllerName);
window.location = url;

【讨论】:

【参考方案3】:
   function functionName(var1, var2) var link = '@Url.Action("MethodName", "Controller", new  id = "-1", name = "-2" )';
    link = link.replace("-1", var1);
    link = link.replace("-2", var2);

之前,替换:

 html += "<a class='k-button k-button-icontext k-primary' href='" + link + "'><i class='fa fa-download'></i> Name Button</a>"

【讨论】:

以上是关于如何在@Url.Action 中传递动态值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Url.Action 中传递区域?

Url.Action:如何将参数从视图传递到控制器?

如何使用 Url.Action 在 asp.net core 2.0 razor 页面中传递多个操作

如何将正确的 Url.Action 传递给 JQuery 方法而没有额外的 & 号麻烦?

如何在不引用 React 中的动态值的情况下在 URL 中传递“:”?

Url.Action 是编码参数值