没有 routeValues 的 Actionlink 正在加载 routeValue 破坏动态页面

Actionlink with no routeValues being loaded with routeValue breaking dynamic pages

当你有一个没有 routeValues 的动作link 并且你用指定的 routeValue 加载该页面 MVC 错误地写出动作link。

我在 MVC 属性路由方面也遇到了完全相同的错误,您在其中指定 url 如下所示:[Route("reviews/{reviewId}")]

我特别遇到过这个问题,它会破坏由 routeValue 加载的动态内容页面,并且当您有多个指向同一页面上的动态操作结果的操作link时。

所以这是例子。谁能解释为什么会这样以及如何解决这个问题?我觉得这是 MVC 中的一个错误,因为页面的行为对我来说确实出乎意料。

操作结果(如果没有提供 id,则默认为默认内容页面):

 public ActionResult Index(string id)
        {
            if (id == "" || id == null) {
                id = "About-Us";
            }
            ContentPage cp = LookupContentPage(id);
            return View(cp);
        }

在 Layout/pages

上执行 link 秒
<ul class="nav navbar-nav">
    <li>@Html.ActionLink("About Us", "Index", "Home")</li>
    <li>@Html.ActionLink("Terms and Conditions", "Index", "Home", new { id = "Terms and Conditions" }, null)</li>
    <li>@Html.ActionLink("User Stories", "Index", "Home", new { id = "User Stories" }, null)</li>
</ul>

现在介绍如何制作错误。在初始页面加载时,锚标记加载如下:

<ul class="nav navbar-nav">
   <li><a href="/">About-Us</a></li>
   <li><a href="/Home/Index/Terms%20and%20Conditions">Terms and Conditions</a></li>
   <li><a href="/Home/Index/User%20Stories">User Storeies</a></li>
</ul>

这是我期望的结果,如果没有提供 id,它会实现我的默认值。但是,在您导航到包含 id 的页面之一之后。因此,如果您的 URL 看起来像这样: http://localhost:57722/Home/Index/User%20Stories

导航加载如下:

<ul class="nav navbar-nav">
     <li><a href="/Home/Index/User%20Stories">About Us</a></li>
     <li><a href="/Home/Index/Terms%20and%20Conditions">Terms and Conditions</a></li>
     <li><a href="/Home/Index/User%20Stories">User Stories</a></li>
 </ul>

如您所见,它破坏了我故意留空的操作 link,没有 Id,因此它应该加载默认值,但它已经消失并写入了自己的 url我没有在操作中指定 link。我觉得这是 MVC 中的一个错误。即使您没有动态页面或默认的 defualt 等,我也觉得它写操作 link 不正确这一事实令人震惊。

我已经解决了这个问题,方法是在用户将 Id 留空的情况下为默认页面创建一个单独的 ActionResult,然后在 returns 相同视图的另一个 ActionResult 中加载动态内容。

编辑 1

我刚刚按照评论中的建议将 NULL 添加到 routeValues 中,但它仍在中断:

 <li>@Html.ActionLink("About Us", "Index", "Home", null,null)</li>

                    <li>@Html.ActionLink("Terms and Conditions", "Index", "Home", new { id = "Terms and Conditions" }, null)</li>
                    <li>@Html.ActionLink("User Stories", "Index", "Home", new { id = "User Stories" }, null)</li>

导航到具有 routeValue

的 link 后输出像这样
<ul class="nav navbar-nav">
                    <li><a href="/Home/Index/Terms%20and%20Conditions">About Us</a></li>

                    <li><a href="/Home/Index/Terms%20and%20Conditions">Terms and Conditions</a></li>
                    <li><a href="/Home/Index/User%20Stories">User Stories</a></li>
                </ul>

添加路由值是因为您使用默认路由和 id 值的分段(例如 url: {controller}/{action}/{id})。该行为是设计使然,并且所有生成 url 的 HtmlHelper 方法(例如 Html.BeginForm() 也是如此)。

为了去除路由值,那么可以使用new { id = "" }

@Html.ActionLink("About Us", "Index", "Home", new { id = "" }, null)

请注意,使用 null 作为参数意味着 使用默认值 。您也可以使用

生成相同的 url
@Html.ActionLink("About Us", null, null, new { id = "" }, null)