路由未按预期工作
Routing don't work as expected
我有以下路由定义:
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;
这两者有什么区别?为什么第一个有效,第二个无效?
你必须使用.replace
方法。
document.location = '@Url.Action("", "formPreview",new {formId ="formId"})'.replace("formId",formId);
在 Razor 中,每个使用 @ 块 的内容都会自动由 Razor HTML 编码。
您指定的内容:@Url.Action("", "formPreview")
,与@Url.Action("","formPreview", new { formId = Model.Id })
不同。它不匹配,因为在路由 table 中你有一个 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);
但是,作为副作用,这意味着每当您创建 URL 而不指定 FormId
时,它会以 /Forhandsgranska/DUMMY
.
的形式出现
我有以下路由定义:
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;
这两者有什么区别?为什么第一个有效,第二个无效?
你必须使用.replace
方法。
document.location = '@Url.Action("", "formPreview",new {formId ="formId"})'.replace("formId",formId);
在 Razor 中,每个使用 @ 块 的内容都会自动由 Razor HTML 编码。
您指定的内容:@Url.Action("", "formPreview")
,与@Url.Action("","formPreview", new { formId = Model.Id })
不同。它不匹配,因为在路由 table 中你有一个 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);
但是,作为副作用,这意味着每当您创建 URL 而不指定 FormId
时,它会以 /Forhandsgranska/DUMMY
.