当你有一个没有routeValues的actionlink并且你用指定的routeValue加载那个页面时,MVC会错误地写出actionlink。
我在MVC属性路由方面也遇到了完全相同的错误,你指定了这样的网址:[Route("reviews/{reviewId}")]
我特别遇到这样的问题,它会破坏由routeValue加载的动态内容页面,并且当你有多个动作链接指向同一页面上的动态动作结果时。
所以这是一个例子。任何人都可以解释为什么会发生这种情况以及如何解决这个问题?我觉得这是MVC中的一个错误,因为页面对我来说是一种意想不到的行为。
操作结果(如果未提供ID,则默认为默认内容页面):
public ActionResult Index(string id)
{
if (id == "" || id == null) {
id = "About-Us";
}
ContentPage cp = LookupContentPage(id);
return View(cp);
}
布局/页面上的操作链接
<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的页面后。因此,如果您的网址如下所示: 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>
正如你所看到的那样,我已故意将行动链接留空,没有Id,因此它应该加载默认值,但是它已经去掉并编写了我自己的url,我没有在动作链接中指定。我觉得这是MVC中的一个错误。即使你没有动态页面或默认使用defualt等,我觉得它是错误的,因为它错误地写了动作链接。
如果用户将Id留空,然后在另一个返回相同View的ActionResult中加载动态内容,我已通过为默认页面创建单独的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
的链接后,输出如下所示<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>
答案 0 :(得分:2)
添加路线值是因为您使用的默认路线包含id
值的分段(例如url: {controller}/{action}/{id}
)。行为是设计的,生成网址的所有HtmlHelper
方法(例如Html.BeginForm()
也是如此)。
要删除路线值,您可以使用new { id = "" }
@Html.ActionLink("About Us", "Index", "Home", new { id = "" }, null)
请注意,使用null
作为参数意味着使用默认值。您也可以使用
@Html.ActionLink("About Us", null, null, new { id = "" }, null)