我想通过提及我已阅读问题来启动我的问题
Passing dynamic javascript values using Url.action()
和
How to pass parameters from @Url.Action to controller
为了拥有更清晰的代码和使用javascript函数打开带有url作为争论的模态窗口我不喜欢在我的javascript文件中使用Razor。出于这个原因,我将所有我的Url操作设置在我的.cshtml页面的PageScripts中,并使用我的函数中的变量。
@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>
}
这样的url动作用于模态窗口我必须从选定的行打开,我必须使用许多参数。我在javascript函数中使用它们的方式就像这样
var uri = params.exampleUrl.replace('pr1Id', actualParameter1Id).replace('pr2Id', actualParameter2Id).replace('pr3Id', actualParameter3Id);
我的控制器就像这样
public ActionResult ExampleAction(string parameter1Id, string parameter2Id, string parameter3Id){
// do stuff and return View...
}
我的问题是当我传递一个参数时,我的控制器正确地得到了值。当我传递多个参数虽然我从调试中看到uri参数已经改变并采用了新参数,但在我的控制器中只有第一个参数正确。其他变量将为空。
示例:
addCandidateTaskUrl: "@Url.Action("Action", "Controller", new { candidacyId = "cId", candidateId = "cndId", typeOfAction = "tpA" })"
来自params的Uri
"/ApplicationName/Controller/Action?candidacyId=cId&candidateId=cnId&typeOfAction=tpA"
替换值后的Uri
"/ApplicationName/Controller/Action?candidacyId=97c89ac6-3571-48a1-a904-d4b3f2594d9b&candidateId=a05amn84-33a1-4fcb-8c89-e44635d67d63&typeOfAction=COMPLETED"
答案 0 :(得分:3)
您在脚本中使用Url.Action()
在网址中生成&
而不是&
,因此不是
../Controller/Action?candidacyId=cId&candidateId=cnId&typeOfAction=tpA"
你需要生成
../Controller/Action?candidacyId=cId&candidateId=cnId&typeOfAction=tpA"
您可以将其打包在Html.Raw()
中,使其未编码
addCandidateTaskUrl: "@Html.Raw(Url.Action("Action", "Controller", new { candidacyId = "cId", candidateId = "cndId", typeOfAction = "tpA" }))"
但是,您可以通过生成基本网址,并使用$.param method
附加查询字符串参数,使这更简单,更高效(无需多个.replace()
)
view.params = {
baseUrl: '@Url.Action("Action", "Controller")' // Html.Raw not required
和
var queryString = $.param({ param1Id: actualParam1Id, param2Id: actualParam2Id, ... });
var uri = params.baseUrl + '?' + queryString;