【问题标题】:Handle Multiple action with same name in MVC在 MVC 中处理具有相同名称的多个操作
【发布时间】:2016-05-17 19:14:56
【问题描述】:

在我的项目中有一个动作

public ActionResult Lead(int leadId)
{
    return 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 动作不支持重载。

我用额外的参数创建了另一个同名的动作,并重定向到新动作,但它不起作用。

public ActionResult Lead(int leadId, int extra=0)
{
    return RedirectToAction("Lead", "Home", new { id = leadId });
}

我找到了一个链接来处理这种情况,但它不适用于我的情况。

ASP.NET MVC ambiguous action methods

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 url-routing


    【解决方案1】:

    处理此问题的一种可能性是编写自定义路由:

    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();
    }
    

    现在以下两个网址都将按预期工作:

    • www.xyx.com/Home/Lead/7
    • www.xyx.com/Home/Lead?leadId=7

    【讨论】:

    • 您能否澄清一下,为什么他的 RedirectToAction 不起作用?
    • @darin:它现在正在工作。但问题又是一样的。现在它开始为参数 id http://www.xyx.com/Home/Lead?id=5 创建查询字符串
    • 调用基本构造函数时,您可以尝试使用"Home/Lead/{id}" 而不是"Home/Lead"。我已经更新了我的答案以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多