c# - 在 MVC 中处理具有相同名称的多个操作

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

在我的项目中有一个 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 });
}

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

ASP.NET MVC ambiguous action methods

最佳答案

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

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/

相关文章:

c# - Entity Framework 6 和 oracle

javascript - ASP.NET MVC 脚本包加载时间过长

c# - 如何重用StringBuilder obj?

c# - 如何从 IGrouping 中获取值

c# - 如何在一个 View 中使用两个模型?

c# - 拆分服务器变量 user_logon

javascript - 通过 ajax 调用将 Html 字符串从 View 传递到 Controller

javascript - 空字符串传递给 jquery.unobtrusive-ajax.js 中的 getElementById() :16

c# - 如何更新 Windows 窗体中的 StatusStrip

c# - 带有列名称的 EF7 支架现有数据库 = 表名称