如何在ASP.NET MVC中使用小写,加上下划线?所以我/dinners/details/2打电话DinnersController.Details(2),如果可能的话,/dinners/more_details/2打电话DinnersController.MoreDetails(2)?
所有这些仍然使用像这样的模式{controller}/{action}/{id}.
在ASP.NET 4中,这与应用程序routes.LowercaseUrls = true;的RegisterRoutes处理程序一样简单.
我无法在ASP.NET Core中找到实现此目的的等价物.我想它会在这里:
app.UseMvc(configureRoutes =>
{
configureRoutes.MapRoute("Default", "{controller=App}/{action=Index}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)
但configureRoutes看起来没什么可以允许的......除非在某个地方找到一个我在文档中找不到的扩展方法呢?
我已经看到你可以在ASP.NET Core 2.0中配置路由以生成小写网址,如下所述:https://stackoverflow.com/a/45777372/83825
使用这个:
services.AddRouting(options => options.LowercaseUrls = true);
Run Code Online (Sandbox Code Playgroud)
但是,虽然这对于生成URL很好,但它似乎没有做任何实际的ENFORCE,也就是说,将任何非全部小写的URL重定向到相应的小写URL(最好是通过301重定向).
我知道人们通过不同的套管网址访问我的网站,我希望它们永久都是小写的.
通过RewriteOptions和Regex进行标准重定向是唯一的方法吗?这样做的恰当表达方式是什么:
var options = new RewriteOptions().AddRedirect("???", "????");
Run Code Online (Sandbox Code Playgroud)
或者还有另一种方式吗?
ASP.NET 默认使用PascalCase URL 组件,但我想改用短横线大小写。我已经看到各种文章和SO 答案通过RouteTokenTransformerConvention(下面的示例代码)在 ASP.NET Core 中优雅地实现了这一点。我喜欢这个策略,因为它 1) 确保 kebab-case 路由映射到正确的控制器,并使用正确的路由参数执行操作,而无需重复的手动工作;2) 允许您生成匹配的 kebab-case 链接。
但是,它不涉及 URL 查询。 有没有办法既能获得上述好处,又能在转换中包含查询键? 例如:
some-route?product-category=some+product+category...ProductCategory将绑定模型的属性设置为"some product category"
ProductCategory想法或使用其他一些手动解决方案)[FromQuery(Name="product-category")]这是我从上述链接中获取的代码作为起点:
连字符.cs
using Microsoft.AspNetCore.Routing;
using System.Text.RegularExpressions;
public class Hyphenator: IOutboundParameterTransformer
{
public string TransformOutbound(object value)
{
if (value == null)
{
return null;
}
return Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
}
}
Run Code Online (Sandbox Code Playgroud)
启动.cs
services.AddControllersWithViews(options …Run Code Online (Sandbox Code Playgroud)