路由未按预期工作

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.

的形式出现