Как передать динамическое значение в @Url.Action?

Я написал следующий 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;            
        }

person Nirman    schedule 17.04.2013    source источник
comment
В настоящее время вы передаете две строки в Url.Action. Они вполне могут быть переменными.   -  person David Hedlund    schedule 17.04.2013
comment
не фиксированы, они должны измениться - откуда берутся значения?   -  person von v.    schedule 17.04.2013
comment
Поскольку @Url.Action является помощником MVC, создание переменной мне не поможет.   -  person Nirman    schedule 17.04.2013


Ответы (3)


У меня есть функции для получения имен вызывающих действий и контроллеров, но я не знаю, как передать их в @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)';
person Darin Dimitrov    schedule 17.04.2013
comment
Я забыл упомянуть, что это функции javascript. См. редактирование, чтобы увидеть эти функции. - person Nirman; 17.04.2013
comment
спасибо Дарин за подробный ответ, однако я не уверен, что вы имели в виду под SomeAction и SomeController. Должно ли это быть имя целевого действия? или он должен быть динамическим? - person Nirman; 17.04.2013
comment
Похоже, вы пытаетесь получить текущее действие и контроллер. Смотрите мой обновленный пример и не используйте для этого javascript. - person Darin Dimitrov; 17.04.2013
comment
это сработало как шарм. Это именно то, что я искал. Большое спасибо Дарин. - person Nirman; 17.04.2013
comment
@DarinDimitrov - Как вы предложили, var param = 'какое-то динамическое значение, известное клиенту'; var url = '@Url.Action(SomeAction, SomeController, new {someParam = param })'; window.location.href = url.replace('параметр', encodeUriComponent(парам));. Вот почему бы нам не передать переменную param сразу в Url.action()? Не могли бы вы объяснить? - person Manikandan; 09.06.2015
comment
Это работает хорошо. Разве мы не можем просто сделать это для нескольких параметров таким же образом? Вероятно, мы можем использовать метод replace несколько раз, используя некоторые временные переменные, но просто любопытно, есть ли лучшие способы - person Peck_conyon; 13.05.2017

Вы пробовали что-то подобное? Сам не пробовал, но должно работать.

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;
person mridula    schedule 17.04.2013

   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>"
person Mario Villanueva    schedule 24.07.2017