我有最简单的设置:
带有一个控制器的空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应该使用当前的路由信息,不是吗?
我错过了什么?
答案 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的适当路由。