大师,
在我的项目中,我指定了许多不同的路线,如下所示。
routes.MapRoute(
name: "StudentMerit",
url: "Student-Merit",
defaults: new { controller = "StudentMerit", action = "GetData"});
routes.MapRoute(
name: "StudentResults",
url: "Student-Results",
defaults: new { controller = "StudentResults", action = "GetData"});
如您所见,网址是用连字符分隔的,我不太担心操作名称
如果我可以告诉 MVC 将连字符替换为空,则所有这些路由都可以重写 URL,它将成为我的 Controller 。
类似于,
routes.MapRoute(
name: "AllInOne",
url: "{Cont-roller}",
defaults: new { controller = {Cont-roller}.replace("-",""), action = "GetData"});
有什么办法可以做到这一点吗? 请帮忙。
提前致谢。
最佳答案
创建您自己的 RouteHandler。我不知道这是否是最好的解决方案。
public class RemoveDashRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = ((string)requestContext.RouteData.Values["controller"]).Replace("-", String.Empty);
return base.GetHttpHandler(requestContext);
}
}
使用
routes.MapRoute(
name: "AllInOne",
url: "{controller}",
defaults: new { controller = "Default", action = "GetData" }
).RouteHandler = new RemoveDashRouteHandler();
编辑替代解决方案
我通过子类化 Route 然后覆盖 GetRouteData 找到了更好的解决方案(在我看来)。更好的是,Route 的职责是生成 RouteData,而 MvcRouteHandler 的职责是获取 IHttpHandler。
public class RemoveDashRoute : Route
{
private const string ControllerKey = "controller";
public RemoveDashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints = null, RouteValueDictionary dataTokens = null, IRouteHandler routeHandler = null)
: base(url, defaults, constraints ?? new RouteValueDictionary(), dataTokens ?? new RouteValueDictionary(), routeHandler ?? new MvcRouteHandler())
{
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var routeData = base.GetRouteData(httpContext);
if (routeData != null && routeData.Values.ContainsKey(ControllerKey))
{
routeData.Values[ControllerKey] = ((string)routeData.Values[ControllerKey]).Replace("-", String.Empty);
}
return routeData;
}
}
使用
routes.Add("AllInOne", new RemoveDashRoute(
url: "{controller}",
defaults: new RouteValueDictionary(new { controller = "Home", action = "GetData" }))
);
关于c# - 带验证的 MVC 自定义路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19707461/