MVC 核心自定义路由

MVC Core Custom Routing

我很难全神贯注于 MVC Core 中的自定义路由。 我知道我需要在 Startup

中添加一些东西
app.UseMvc(routes =>
{
    routes.MapRoute(
       name: "default",
       template: "{controller=Home}/{action=Index}/{id?}");
});

但是我该如何让控制器正常工作呢? 我基本上需要一个数据详细信息视图来使用字符串而不是 id 来提取。 所以 "string url" 而不是 "int id".

我在网上看了一些文章,但我尝试的一切似乎都失败了。 提前致谢。

通过添加路由约束,告诉您的代码,id 将是一个字符串(单词),您应该没问题;

app.UseMvc(routes =>
{
    routes.MapRoute(
       name: "default",
       template: "{controller=Home}/{action=Index}/{id}",
       defaults: null,
       constraints: new {Id = @"\w+" }); /* \d+ limits to only digits*/
});

参考:http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

或者您可以使用 AttributeRouting 并使用适当的 Route() 注释装饰您的控制器和操作方法:

[Route("api/[controller]")]
public class HomeController : Controller
{
    [Route("[action]/{name}")]
    public string GetSomething(string name)
    {
        return foo;
    }
}

MVC Core 的正确解决方案是添加如下约束:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}", 
        defaults: null,
        constraints: new { id = @"\w+" }); /* \d+ limits to only digits*/
});

为了防止编译错误的发生,你需要为defaults提供一个值(在本例中为null),而且它应该是constraints,而不是[=13] =].为防止以后可能出现的问题,您还应注意 id 参数的大小写。

But how am I supposed to get a controller to function properly?

我只想强调这只是多种选择中的一种。 当你想美化 url 和管理 url 中的第三个斜杠时,使用路由。当 url 可见时,这是最好的选择,但请记住,如果您正在处理 ajax,例如您可以直接使用没有路由规则的查询字符串:controller/action?id=hello

如果您需要的是路由规则:

  1. 您可以修改默认规则以在 id 参数中也接受一个字符串,并继续使用接受 'id'.

    [=25= 的方法]
  2. 添加另一个规则,接受另一个参数,例如 'code' 或适合您使用字符串研究密钥的方法的名称。一种 然后在各个级别自定义新绑定(例如所有 controllers\actions、单个控制器的默认设置,...)

  3. 您也可以在控制器中使用 C# 属性添加该自定义规则。 (优点:你在方法上有规则,所以记住它很有用,你可以在另一个项目中导入控制器及其所有路由规则。缺点:在大型项目中可能很难理解如何交互所有分布在各种文件)。

您使用路由约束来限制与特定路由匹配的浏览器请求。您可以使用正则表达式来指定路由约束。