我有以下路线定义:
routes.MapRoute(
"FormPreview",
"Forhandsgranska/{FormId}/{action}/{id}",
new { controller = "FormPreview", action = "Introduction", id = UrlParameter.Optional }
);
我有以下代码触发路线,它完美无缺:
$('#previewButton').on('click', function(){
document.location = '@Url.Action("","formPreview", new { formId = Model.Id })';
});
但是现在我有以下代码无效。我的路由定义未被触发,我被重定向到错误的页面,我不知道原因:
var formId = $(this).closest('tr').data('formId');
document.location = "@Url.Action("", "formPreview")/" + formId;
这两者有什么区别?为什么第一个工作而不是第二个?
答案 0 :(得分:1)
您必须使用.replace
方法。
document.location = '@Url.Action("", "formPreview",new {formId ="formId"})'.replace("formId",formId);
在Razor中,使用 @ block 的所有内容都会自动由Razor进行HTML编码。
答案 1 :(得分:1)
您指定的内容:@Url.Action("", "formPreview")
,不与@Url.Action("","formPreview", new { formId = Model.Id })
相同。它不匹配,因为在路由表中您有 required formId,但您尚未在@Url.Action
中指定它。
由于路由生成的URL在JavaScript有机会与之交互之前发生,我认为一种(hacky)方法是创建一个虚拟formId值并在客户端用实际值替换它
document.location = '@Url.Action("", "formPreview",new {formId ="DUMMY"})'.replace("DUMMY",formId);
或者,当未提供formId时,您可以将虚拟对象添加为默认值。
routes.MapRoute(
"FormPreview",
"Forhandsgranska/{FormId}/{action}/{id}",
new { controller = "FormPreview", FormId = "DUMMY", action = "Introduction", id = UrlParameter.Optional }
);
然后您可以在需要时替换客户端上的值。
document.location = '@Url.Action("", "formPreview")'.replace("DUMMY",formId);
但是,副作用意味着无论何时创建网址而未指定FormId
,它都会显示为/Forhandsgranska/DUMMY
。