Обновление
Поскольку вы хотите написать HttpModule, который очень близко имитирует работу System.Web.Routing
, то, возможно, вам следует использовать ILSpy и отражать сборкуи посмотрите, что он делает?
Оригинальный ответ (сохранен для потомков)
Непонятно, говорите ли вы о ASP.NET MVC или о Spring MVC или оРасширения Spring.NET для ASP.NET MVC.Если это первое или третье:
Для вашего первого примера:
Admin/{*}
решение № 1 ниже будет решать это.Для вашего второго примера:
Products/{*}/Search
, решение № 2 будет решать его (если есть необходимость проверить или действительно иметь что-то действительное там)
Два решения:
- Создание маршрутов, которые принимают эти параметры (но ничего с ними не делают или не заботятся о них)
- Создают ActionFilter, который проверяет запрос этих параметров (из маршрута) изатем заменяет их тем, что на самом деле должно быть.
Решение 1
В разделе маршрутов в global.asax.cs
:
routes.MapRoute("AdminAnything",
"Admin/{*anything}",
new { controller = admin, action = "Show" }
);
Это приведет кследующие URL-адреса для разрешения действия Show в контроллере администратора (игнорируя при этом входные данные по своему усмотрению):
Admin/Options
Admin/Anything-I-Want-here
Решение 2
Теперь второй способ сложнее, поскольку у вас действительно естьчто-то среднее между ними.
Пример ввода:
Product/{*}/Search
Вы можете написать ActionFilter, который перехватывает запрос, просматривает его и заменяет это значение тем, что вы хотите.
Во-первых, нНеобходимый маршрут:
routes.MapRoute("ProductSearch",
"Products/{searchType}/Search,
new { controller = "Products", action = "Search" }
);
Затем действие вашего контроллера:
public ActionResult Search(string searchType)
{
//do nothing with searchType here.
}
Если вы хотите заменить это чем-то, вы можете отправить в скрытое поле формы в вашем представлении и обработать это.в Actionfilter:
public class SearchValidationActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if(filterContext.ActionParameters.ContainsKey("searchType") && filterContext.HttpContext.Request.Headers["hiddenSearchType"].IsNotNullOrEmpty()))
{
var actualSearchType = filterContext.ActionParameters["hiddenSearchType"] as SearchType;
var searchType = filterContext.ActionParameters["searchType"];
if (actualSearchType != null)
{
if (searchType.IsNullOrEmpty())
{
filterContext.Result = new SearchRedirectResult(actualSearchType.Name);
}
else if (!actualSearchType.Name.Equals(searchType))
{
filterContext.Result = new SearchRedirectResult(actualSearchType.Name,);
}
}
}
base.OnActionExecuting(filterContext);
}
}
По сути, решение № 2 принимает все, и, основываясь на скрытом типе поиска, передает его фактическому типу поиска.