81

How can I access JavaScript value inside @URL.Action()? something like:

<script type="text/javascript">
function name(myjavascriptID)
{
     jQuery("#list_d").jqGrid('setGridParam', { url: '@URL.Action("download file", "download", new { id = <myjavascriptID> })', page: 1 });

}
</script>

6 Answers 6

152

You can't. JavaScript doesn't execute when generating the action URL. What you can do, is do something like this:

function name(myjavascriptID)    {
     var link = '@Url.Action("download file", "download", new { id = "-1" })';
     link = link.replace("-1", myjavascriptID);

     jQuery("#list_d").jqGrid('setGridParam', { url: link, page: 1 });
}
Sign up to request clarification or add additional context in comments.

8 Comments

Thank you for your answer, it works with one small modification: instead of link.href I need to use link . Thanks very much!
What if id will be string like "Hello world" ?
The idea is for the -1 to be something uniquely identifiable in the string, for you to replace with whatever you want. You would need to make sure Hello World is encoded, like Hello+World. But yes, replace it with whatever you want
is there no cleaner solution?
remove capital URL prefixed before @URL.Action to @Url.Action as it shows compile time error
|
21

I do something fairly similar, but less verbose:

var myUrl = '@Url.Action("Solution","Partner")/' + myjavascriptID;
$.ajax.load(myUrl); // or whatever

We can do this because of routing, and ultimately Url.Action with route dictionary parameters translates into a URI that looks like:

http://localhost:41215/Partner/Solution?myJavascriptID=7

Just a second choice, because as a wise old man once said "It is our choices, Harry, that show what we truly are, far more than our abilities."

1 Comment

It will break RoutAttribute configuration :(((
14

You can pass in the variables to any link as shown below...

var url = '@Html.Raw(@Url.Action("MethodName", "ControllerName"))' + '?id = ' + myjavascriptID

Comments

2

In the same vein as Brian Mains's answer, you could format your url string instead of replacing -1 with your variable, that is if like me, you judge it is better to read. The following answer assumes that you've modified String's prototype as suggested in this answer:

var url = unescape('@Url.Action("download file", "download", new { id = "{0}" })').format(myjavascriptID);

The unescape call is necessary if you want to decode your {0}. I like this alternative, because it makes it easier to have multiple parameters from JS variables. For instance:

var url = unescape('@Html.Raw(Url.Action("Action", "Controller", new { id = "{0}", name = "{1}" }))').format(myID, myName);

I added Html.Raw in my second example in order to avoid having &amp in the url string.

1 Comment

Add your answer with this one and got the perfect answer: stackoverflow.com/a/36981170/453142
1

You can replace url like code below

var jsUrl = '@Url.Action("action", "controller")'; // ## is the token
var getUrl = jsUrl.replace('action', action).replace('controller', controller)  
$("#RenderPartial").load(getUrl); 

Comments

0

You can build the JavaScript code in C# this way:

function fun(jsId) {
  var aTag = '<a href="@Html.Raw(@Url.Action("ActionName", "ControllerName", new { objectId = "xxx01xxx" }).Replace("xxx01xxx", "' + jsId + '"))">LINK</a>';
}

Here is the code from the question rewritten using this technique:

function name(myjavascriptID) {
  jQuery("#list_d").jqGrid('setGridParam', { url: '@Html.Raw(@URL.Action("download file", "download", new { id = "XXXmyjavascriptIDXXX" }).Replace("XXXmyjavascriptIDXXX", "' + myjavascriptID + '"))', page: 1 });
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.