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

时间:2017-11-20 21:08:17

标签: c# asp.net-mvc razor actionlink actionresult

当你有一个没有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>

1 个答案:

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