How to pass dynamic value in @Url.Action?
Asked Answered
T

3

22

I have written following jquery in my partial view:

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

The Action name and Controller name are not fixed, they are bound to change depending upon the view wherein this partial view is placed. I have functions to fetch invoking action and controller names, but not sure how I can pass them in @Url.Action.

Following are Javascript functions to fetch action and controller names:

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;            
        }
Tbar answered 17/4, 2013 at 6:3 Comment(3)
Your currently passing two strings to Url.Action. They could well be variables.Aesthete
"are not fixed, they are bound to change" - where are the values coming from?Plantar
As @Url.Action is an MVC helper, Creating a variable will not help me..Tbar
B
33

I have functions to fetch invoking action and controller names, but not sure how I can pass them in @Url.Action

Well, you could call those functions. For example if they are extension methods to the UrlHelper class:

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

or if they are just static functions:

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

If on the other hand the values that need to be passed are known only on the client you could do the following:

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));

UPDATE:

It seems that you are just trying to fetch the current controller and action which could be achieved like that:

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

and then:

window.location.href = '@Url.Action(currentAction, currentController)';
Breazeale answered 17/4, 2013 at 6:8 Comment(5)
I forgot to mention, they are javascript functions.. see the edit to see those functions.Tbar
thanks Darin for the detailed answer, however, I am not sure what you meant by "SomeAction" and "SomeController". Should this be a name of target Action? or should it be dynamic?Tbar
You seem to be attempting to fetch the current action and controller. See my updated example and do not use javascript for that.Breazeale
@DarinDimitrov - As you have suggested, 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));. Here why should not we pass the variable param straight away to the Url.action()? Can you please explain?Nitroso
This is working well . Can't we just do this for multiple parameters in the same way ? We can probably use replace method few times using some temp variables, but just curious whether there are better waysGirdler
D
4

Have you tried something like this? I haven't tried it myself, but it should work.

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;
Disaster answered 17/4, 2013 at 6:19 Comment(0)
T
1
   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);}

before, replace:

 html += "<a class='k-button k-button-icontext k-primary' href='" + link + "'><i class='fa fa-download'></i> Name Button</a>"
Tenne answered 24/7, 2017 at 13:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.