I would like to start my question by mentioning that I have read the questions
Passing dynamic javascript values using Url.action()
and
How to pass parameters from @Url.Action to controller
For having cleaner code and for having javascript functions that open modal windows with the url as an arguement I prefer not using Razor in my javascript files. For that reason I set all my Url actions inside the PageScripts of my .cshtml pages like this and I use the variables in my functions.
@section PageScripts {
// render necessairy scripts
<script type="text/javascript">
view.params = {
exampleUrl: "@Url.Action("ExampleAction", "ExampleController", new { parameter1Id = "pr1Id", parameter2Id = "pr2Id", parameter3Id = "pr3Id" })",
// More url actions and page module parameters
}
};
</script>
}
Such url actions are used on modal windows I have to open from selected rows where I have to use many parameters. The way I use them in my javascript functions is like this
var uri = params.exampleUrl.replace('pr1Id', actualParameter1Id).replace('pr2Id', actualParameter2Id).replace('pr3Id', actualParameter3Id);
My controller is like like this
public ActionResult ExampleAction(string parameter1Id, string parameter2Id, string parameter3Id){
// do stuff and return View...
}
My problem is that when I pass one parameter my controller get's the value correctly. When I pass more than one parameters although I see from debugging the uri parameter has changed and has taken the new parameters, in my controller only the first one comes correctly. The other variables are coming null.
Examples:
addCandidateTaskUrl: "@Url.Action("Action", "Controller", new { candidacyId = "cId", candidateId = "cndId", typeOfAction = "tpA" })"
Uri from params
"/ApplicationName/Controller/Action?candidacyId=cId&candidateId=cnId&typeOfAction=tpA"
Uri after replace of values
"/ApplicationName/Controller/Action?candidacyId=97c89ac6-3571-48a1-a904-d4b3f2594d9b&candidateId=a05amn84-33a1-4fcb-8c89-e44635d67d63&typeOfAction=COMPLETED"
You usage of
Url.Action()in the script is generating&instead of&in the url, so instead ofyou need to generate
You can do this by wrapping it in
Html.Raw()so its not encodedHowever, you can make this simpler and more efficient (without the need for multiple
.replace()) by just generating the base url, and the appending the query string parameters using the $.param methodand