为什么@ Html.ActionLink不使用RouteData

时间:2014-08-02 12:10:51

标签: asp.net-mvc asp.net-mvc-routing html.actionlink

我有最简单的设置:

带有一个控制器的空asp.net MVC应用程序:

public class HomeController : Controller
{
    public ActionResult Edit(int id)
    {
        return View();
    }

    public ActionResult Commit(int id)
    {
        return View();
    }
}

我的Edit.cshtml调用了ActionLink(),如下所示:

@Html.ActionLink("Commit Data", "Commit")

如果我现在通过“ / Home / Edit / 2 ”访问编辑操作,我希望渲染的链接将用户引导至“ / Home / Commit / 2 ”。

它没有:( ...链接创建为“Home / Commit”,完全忽略当前的RouteData条目。

我正在使用默认路由配置(尚未添加任何路由)。

解决此问题的一种方法是为两个操作添加显式路由:

        routes.MapRoute(
                name: null,
                url: "Home/Edit/{id}",
                defaults: new { controller = "Home", action = "Edit" }
        );

        routes.MapRoute(
                name: null,
                url: "Home/Commit/{id}",
                defaults: new { controller = "Home", action = "Commit" }
        );

        routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

这有效 - 但我真的不想明确定义应用中的每一条路线 - 如果我使用“默认”模式......

第二种解决方案是手动添加路由值,如下所示:

@Html.ActionLink("Commit Data", "Commit", "Home", new {id = Model.Id})

但这似乎也不对 - ActionLink应该使用当前的路由信息​​,不是吗?

我错过了什么?

1 个答案:

答案 0 :(得分:0)

好的,如果其他人想知道同样的事情 - 或者只是想要一个有效的解决方案......

我只是在我的自定义ViewPage基类上创建了自己的@ActionLink()辅助方法:

    protected MvcHtmlString ActionLink(string linkText, string actionName)
    {
        var routeData = ViewContext.RequestContext.RouteData;

        var id = routeData.Values["id"];

        if (id != null)
            return Html.ActionLink(linkText, actionName, new {id = id});

        return Html.ActionLink(linkText, actionName);
    }

这正是我想要的。现在我可以打电话了

@ActionLink("Commit", "Commit")

当我在具有id的内容的上下文中时,链接将指向此Id的适当路由。