Update
因为您想编写一个非常接近地模仿工作的 HttpModuleSystem.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 解析为管理控制器中的“显示”操作(从而根据需要忽略输入):
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 接受任何内容,并根据隐藏的搜索类型将其传递给实际的搜索类型。