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*/
});
或者您可以使用 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
如果您需要的是路由规则:
您可以修改默认规则以在 id 参数中也接受一个字符串,并继续使用接受 'id'.
[=25= 的方法]
添加另一个规则,接受另一个参数,例如 'code' 或适合您使用字符串研究密钥的方法的名称。一种
然后在各个级别自定义新绑定(例如所有 controllers\actions、单个控制器的默认设置,...)
您也可以在控制器中使用 C# 属性添加该自定义规则。
(优点:你在方法上有规则,所以记住它很有用,你可以在另一个项目中导入控制器及其所有路由规则。缺点:在大型项目中可能很难理解如何交互所有分布在各种文件)。
您使用路由约束来限制与特定路由匹配的浏览器请求。您可以使用正则表达式来指定路由约束。
我很难全神贯注于 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*/
});
或者您可以使用 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
如果您需要的是路由规则:
您可以修改默认规则以在 id 参数中也接受一个字符串,并继续使用接受 'id'.
[=25= 的方法]添加另一个规则,接受另一个参数,例如 'code' 或适合您使用字符串研究密钥的方法的名称。一种 然后在各个级别自定义新绑定(例如所有 controllers\actions、单个控制器的默认设置,...)
您也可以在控制器中使用 C# 属性添加该自定义规则。 (优点:你在方法上有规则,所以记住它很有用,你可以在另一个项目中导入控制器及其所有路由规则。缺点:在大型项目中可能很难理解如何交互所有分布在各种文件)。
您使用路由约束来限制与特定路由匹配的浏览器请求。您可以使用正则表达式来指定路由约束。