在我的项目中有一个 Action
public ActionResult Lead(int leadId)
{
return View();
}
在 View 中,一个ActionLink
是这样创建的
@Html.ActionLink("Old Link", "Lead", "Home", new { leadId = 7 }, null)
但过了一段时间,为了使 URL 更干净,我更改了该操作的参数名称
public ActionResult Lead(int id)
{
return View();
}
和ActionLink
相应地改变
@Html.ActionLink("New Link", "Lead", "Home", new { id = 5 }, null)
但旧链接已在多个社交网站共享。每当有人点击那个旧链接时,他就会被重定向到页面 www.xyx.com/Home/Lead?leadId=7
但现在在我的应用程序中,不存在这样的 URL。
为了解决这个问题,我想到了重载,但是MVC action不支持重载。
我用额外的参数创建了另一个同名的 Action ,并重定向到新的 Action ,但它不起作用。
public ActionResult Lead(int leadId, int extra=0)
{
return RedirectToAction("Lead", "Home", new { id = leadId });
}
我找到了一个链接来处理这种情况,但它对我的情况不起作用。
最佳答案
处理此问题的一种可能性是编写自定义路由:
public class MyRoute : Route
{
public MyRoute() : base(
"Home/Lead/{id}",
new RouteValueDictionary(new
{
controller = "Home",
action = "Lead",
id = UrlParameter.Optional,
}),
new MvcRouteHandler()
)
{
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var rd = base.GetRouteData(httpContext);
if (rd == null)
{
return null;
}
var leadId = httpContext.Request.QueryString["leadid"];
if (!string.IsNullOrEmpty(leadId))
{
rd.Values["id"] = leadId;
}
return rd;
}
}
您将在默认注册之前注册:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new MyRoute());
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
现在您只能执行一个操作:
public ActionResult Lead(int id)
{
return View();
}
现在以下两个 url 都将按预期工作:
- www.xyx.com/Home/Lead/7
- www.xyx.com/Home/Lead?leadId=7
关于c# - 在 MVC 中处理具有相同名称的多个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35264331/