我正在专门寻找一种自动连接 CamelCase 操作和视图的方法。也就是说,我希望不必实际重命名我的视图或向站点中的每个 ActionResult 添加装饰器。
到目前为止,我一直在使用routes.MapRouteLowercase
, 如图所示here。这对于 URL 结构的小写部分非常有效,但对于连字符则不然。所以我最近开始玩规范化(通过 NuGet 安装),但它还没有任何连字符。
我正在尝试...
routes.Canonicalize().NoWww().Pattern("([a-z0-9])([A-Z])", "$1-$2").Lowercase().NoTrailingSlash();
我的正则表达式肯定按照我想要的方式工作,只要正确地重构 URL,但这些 URL 当然不会被识别。文件还在ChangePassword.cshtml
,例如,所以/account/change-password
不会指出这一点。
顺便说一句,我对 .NET MVC 还是有点生疏。我已经好几年没有使用它了,而且从 v2.0 开始就没有使用过它。
这可能有点乱,但如果您创建了一个自定义HttpHandler and 路由处理程序那么这应该可以防止你不得不重新命名你的所有观点和行动。您的处理程序可以从请求的操作中删除连字符,这会将“change-password”更改为changepassword,从而呈现ChangePassword操作。
为了简洁起见,代码被缩短了,但重要的部分仍然存在。
public void ProcessRequest(HttpContext context)
{
string controllerId = this.requestContext.RouteData.GetRequiredString("controller");
string view = this.requestContext.RouteData.GetRequiredString("action");
view = view.Replace("-", "");
this.requestContext.RouteData.Values["action"] = view;
IController controller = null;
IControllerFactory factory = null;
try
{
factory = ControllerBuilder.Current.GetControllerFactory();
controller = factory.CreateController(this.requestContext, controllerId);
if (controller != null)
{
controller.Execute(this.requestContext);
}
}
finally
{
factory.ReleaseController(controller);
}
}
我不知道我是否以最好的方式实现了它,这或多或少是从第一个开始的sample我碰到。我自己测试了代码,因此这确实呈现了正确的操作/视图并且应该可以解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)