如何将2个路由映射到同一个URL

本文关键字:同一个 URL 映射 路由 2个 | 更新日期: 2023-09-27 18:02:06

我想要一个网页做不同的事情取决于什么网页访问之前是。

基本上,我知道如何使数据具有持久的持久性。然而,我的方法涉及到使用查询字符串,但我不希望第二个用户能够访问一个网页与查询字符串已经创建了以前。因此,我试图通过将多个路由映射到单个url来解决这个问题。这在c# MVC中可能吗?

具体来说,每当我从我的视图点击我的链接时(它可以在下面找到),被调用的路由只是第一个具有url Search_History_Page的路由。这意味着不会调用带有相应动作方法的路由。The_Search_History_Page

这是我的route.config

using System.Web.Mvc;
using System.Web.Routing;
namespace CBCM_Audio_Searcher
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute(
                name: "Route_That_Leads_To_The_Home_Page_As_The_First_Page",
                url: "The_Home_Page",
                defaults: new { controller = "First_", action = "Goes_To_The_Home_Page_As_The_First_Page"}
            );
            routes.MapRoute(
                name: "Route_That_Leads_To_The_Search_History_Page_As_The_First_Page",
                url: "The_Search_History_Page",
              defaults: new { controller = "First_", action = "Goes_To_The_Search_History_Page_As_The_First_Page", id = 1}
            );
            routes.MapRoute(
               name: "Route_That_Leads_To_The_Search_History_Page_From_The_Home_Page",
               url: "The_Search_History_Page",
               defaults: new { controller = "First_", action = "Goes_To_The_Search_History_Page_From_The_Home_Page", id=0 }
           );
        }
    }
}

这是我的控制器。

using System.Web.Mvc;
using System.Diagnostics; 
namespace CBCM_Audio_Searcher.Controllers
{
    public class First_Controller : Controller
    {
        public ActionResult Goes_To_The_Home_Page_As_The_First_Page()
        {
            Database_Data_Modifier_And_Extractor  Database_Data_Modifier_And_Extractor=new  Database_Data_Modifier_And_Extractor();  
            if (Database_Data_Modifier_And_Extractor.Checks_If_A_User_Can_Access_The_Website() == false)
            {
                return Redirect("http://www.google.com");  
            }
            else 
            {
                ViewData["User_ID"]=Database_Data_Modifier_And_Extractor.User_ID;         
                return View("The_Home_Page");
            }
        }
        public ActionResult Goes_To_The_Search_History_Page_As_The_First_Page(string User_ID,string DummyVariable, int id)
        {
            Debug.WriteLine(id); 
            return View("The_Search_History_Page"); 
        }
        public ActionResult Goes_To_The_Search_History_Page_From_The_Home_Page(string User_ID, string DummyVariable, int id)
        {
            Debug.WriteLine(id);
            return View("The_Search_History_Page");
        }
    }
}
这是我的The_Home_Page_View。
@Html.ActionLink("Your Search Results", "Goes_To_The_Search_History_Page_From_The_Home_Page", "First_", new { User_ID = ViewData["User_ID"], DummyVariable = "a"}, null)  

My The_Search_History_Page View为空。

如何将2个路由映射到同一个URL

MVC有一个为方法指定动作名称的特性。您可以通过使用ActionNameAttribute装饰方法并将新操作名称作为参数传递来指定名称。

所以当/Home/Bar请求来的时候,它将被交给MyActionMethod方法处理。

public class HomeController : Controller
{
    [ActionName("Bar")]
    public ActionResult MyActionMethod()
    {
        return Content("Foo");
    }
    [MyActionSelector]
    [ActionName("Foo")]
    public ActionResult Foo()
    {
        return Content("Foo");
    }
    [MyActionSelector]
    [ActionName("Foo")]
    public ActionResult Foo2()
    {
        return Content("Foo2");
    }
}

当请求来在MVC将查找基于路由表和ActionNameAttribute的方法,将处理请求。当MVC发现一个请求有两个以上的方法时,它会抛出AmbiguousMatchException

从方法列表中,您可以通过创建自定义ActionMethodSelectorAttribute来指定哪个方法将处理请求。当ActionMethodSelectorAttribute被装饰成任何方法时,MVC将在执行返回响应的方法之前执行IsValidForRequest。如果IsValidForRequest返回true, MVC将执行返回响应的方法。否则MVC将查找符合路由标准的其他方法。

要创建自己的属性,您必须扩展ActionMethodSelectorAttribute类并覆盖IsValidForRequest方法。IsValidForRequest方法有controllerContextmethodInfo作为输入参数。根据有多少方法能够满足请求,可以多次调用此方法。每次methodInfo都有关于处理请求的方法的不同信息(基于路由表/ActionNameAttribute)。

public class MyActionSelectorAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        HttpRequestBase request = controllerContext.RequestContext.HttpContext.Request;
        // your custom method selection logic goes here
        // select method based on previously searched term
        if (request.QueryString["foo"] != null && methodInfo.Name == "Foo")
        {
            return true;
        }
        else if (request.QueryString["foo2"] != null && methodInfo.Name == "Foo2")
        {
            return true;
        }
        return false;
    }
}

在我们的情况下,当请求来/Home/Foo MVC有两个方法FooFoo2应该处理请求。正如我之前所说的,在执行任何返回响应的方法之前,MVC将为这两个方法调用MyActionSelectorAttribute.IsValidForRequest。为了说明目的,我们抓取QueryString is并检查

1)如果foo在查询字符串中存在并且方法也是foo,则返回true(意味着允许执行Foo方法)

2)如果查询字符串包含Foo2并且方法也是Foo2,则返回true(意味着允许执行Foo2方法)