如何将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为空。
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
方法有controllerContext
和methodInfo
作为输入参数。根据有多少方法能够满足请求,可以多次调用此方法。每次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有两个方法Foo
和Foo2
应该处理请求。正如我之前所说的,在执行任何返回响应的方法之前,MVC将为这两个方法调用MyActionSelectorAttribute.IsValidForRequest
。为了说明目的,我们抓取QueryString is并检查
1)如果foo在查询字符串中存在并且方法也是foo,则返回true(意味着允许执行Foo
方法)
2)如果查询字符串包含Foo2并且方法也是Foo2,则返回true(意味着允许执行Foo2
方法)