路由不按预期工作

时间:2017-02-02 07:16:33

标签: javascript c# jquery asp.net-mvc asp.net-mvc-routing

我有以下路线定义:

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;

这两者有什么区别?为什么第一个工作而不是第二个?

2 个答案:

答案 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