我正在尝试使用属性路由进行路由。
当我这样定义路由时,它不会重定向到页面。
public class HomeController : Controller
{
[Route("/blog")]
public IActionResult BlogsPage()
{
return View();
}
}
相反,当我更改路线定义时,页面会正确打开。
例如:
public class HomeController : Controller
{
[Route("/blogs")]
public IActionResult BlogsPage()
{
return View();
}
}
或
public class HomeController : Controller
{
[Route("/blog2")]
public IActionResult BlogsPage()
{
return View();
}
}
这样,当“blogs”定义为“blog2”时,页面会打开,但不会以“blog”定义打开。
我该如何解决这个问题?
Program.cs
中的路由相关配置
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
我尝试通过更改
Program.cs
中的配置来获得不同的结果,但没有成功。
我正在尝试使用属性路由进行路由。当我定义 这样路由,不会重定向到页面。
嗯,根据您的场景和描述,不清楚您是如何尝试到达路线的,这也是关键点。根据您的program.cs配置,您的默认路由已设置为
{controller=Home}/{action=Index}/{id?}
,控制器中也缺少索引,并且根据属性路由定义索引将默认调用。因此,它应该返回 404 错误。
这样,当“blogs”定义为“blog2”时,页面打开了,但是 它不会以“博客”定义打开。
不太明显,为什么你无法到达路线终点。我已经在本地测试中进行了尝试,并且可以从浏览器访问端点,如下所示:
我该如何解决这个问题?
在转向解决方案之前,让我向您解释一些事情,如果您检查 [Route("")] 接口,该接口是从 IRouteTemplateProvider 派生的 RouteAttribute 类型,具有 Template 和 Name 属性,如下所示:
因此,如果你想从另一个控制器操作重定向到路由,你应该通过路由名称来调用它,而不是代码中缺少的模板名称,并且你已经使用了 [Route("/blog")] 这是模板名称。
解决方案:
Y为了解决您的问题,除了路线模板之外,您还应该使用路线名称。您可以按照以下步骤操作:
[Route("blog", Name = "blog")]
public IActionResult BlogsPage()
{
return View();
}
注意: 第一个是路由模板,下一个是路由名称,当从另一个控制器动作调用时,您应该根据您的场景使用路由名称。
最重要的是,从您想要重定向到博客操作的操作,您可以像下面这样操作:
public IActionResult Index()
{
return RedirectToRoute("blog");
}
输出:
此外,如果你想在开始时加载你的博客操作,你应该配置你的默认路由模式。
注意:请参阅此官方文档以获取有关属性路由的更多详细信息。