3

我的一个观点有一个锚点:

<a name="@("Doc" + Model.Key)"></a>

我想从另一个视图链接到这个锚点:

<a href="@(Url.Action("Update") + "#Doc" + Model.DocumentId)">Go To Document Properties</a>

这会生成一个这样的 url:http://localhost:60010/Session/Update#Doc1

当我单击此链接时,我收到以下错误:

参数字典包含“Controllers.SessionController”中方法“System.Web.Mvc.ActionResult Update(Int32)”的不可为空类型“System.Int32”的参数“id”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

我使用的是默认路由,没有自定义路由:

routes.MapRoute("Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

如何让 MVC 忽略 url 中的 html 锚(#Doc1例如)?

4

2 回答 2

4

根据@BrettSmith 发布的建议,我提出了以下解决方案:

  1. 我添加了带有锚点和约束的第二条路线,这样只有在指定了锚点时才会选择这条路线。

    routes.MapRoute(
            "DocAnchor", // Route name
            "{controller}/{action}/{id}#{anchor}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional, anchor = UrlParameter.Optional }, // Parameter defaults
            new { anchor = ".+" } // ".+" regex means any character one or more times.
        );
    
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );      
    
  2. 我修改了指向此的链接:

    <a href="@(Url.Action("Update", new { id=Model.DocumentId, anchor="Doc" + Model.DocumentId }).Replace("%23", "#"))">Go To Document Properties</a>
    

    请注意,我将锚点作为路由数据对象的一部分传递(我也有一个错误,我没有传递 id,我也修复了该错误)。 Url.ActionUrlEncodes 字符串,所以我不得不%23用散列字符替换 让浏览器识别锚点。

于 2012-06-29T19:49:20.530 回答
2

我有一条路线可以做到这一点,但是在硬盘驱动器故障中丢失了,您需要从内存中指定一条路线,其中包括

{controller}/{action}#{documentid}

documentid 可以是任何不是 id 的东西

你还需要让你的控制器期望 int? id 而不是 int id

于 2012-06-29T19:28:56.797 回答