没有 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)
当你有一个没有 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
作为参数意味着 使用默认值 。您也可以使用
@Html.ActionLink("About Us", null, null, new { id = "" }, null)