重定向到区域始终提供404或错误的重定向

时间:2016-08-19 10:12:55

标签: c# redirect asp.net-core asp.net-core-mvc .net-core

我正在尝试制作一个应用程序,其中包含一个只有在您登录时才能进入的区域。

enter image description here

出于某种原因,我在登录后重定向到我的区域时失败了。导致以下路线生成

 var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
 if (result.Succeeded)
 {
    _logger.LogInformation(1, "User logged in.");
    return RedirectToAction("Index", "Home", new { area = "Dashboard" });
  }

重定向的路由: http://localhost:23490/Account/Login?ReturnUrl=%2FDashboard%2FHome

如果我直接浏览链接(如此)http://localhost:23490/Dashboard/Home/Index

我得到了404

我想要达到的控制器是这样定义的

  //[Authorize]
[Area("Dashboard")]
[Route("Dashboard/[controller]")]
public class HomeController : Controller
{
    // GET: Dashboard
    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }

我检查了有关这个主题的所有内容,但由于这是非常新的,因此没有太多相关信息。

我尝试了什么

  • 检查是否查看&控制器定义正确,它们是
  • 检查路由是否正确,对我来说似乎是

            app.UseMvc(routes =>
        {
            routes.MapRoute(name: "areaRoute",
                template: "{area:exists}/{controller=Home}/{action=Index}");
    
            routes.MapRoute(
                name: "default",
                template: "{controller=Route}/{action=Index}/{id?}");
        });
    
  • 尝试为操作创建自定义重定向(失败)

我希望有人可以帮助我解决这个问题。 谢谢!

1 个答案:

答案 0 :(得分:4)

要使您的示例正常工作,您应该将[HttpGet("Index")]方法标记为Index

[Area("Dashboard")]
[Route("Dashboard/[controller]")]
public class HomeController : Controller
{
    // GET: Dashboard
    [HttpGet("Index")]
    public ActionResult Index()
    {
        return View();
    }

因此,您的HomeController以RESTFUL方式工作,因此您可以使用public IActionResult Get()[HttpPost] public IActionResult Post()。如果这是你想要的,你可以用更通用的方式实现它

[Area("Dashboard")]
[Route("[area]/[controller]")]
public class HomeController : Controller
{
    // GET: Dashboard
    [HttpGet("Index")]
    public ActionResult Index()
    {
        return View();
    }

如果你不希望RESTFUL为你的仪表板,你需要移除[HttpGet("Index")]并将[action]添加到你的控制器属性,所以如果是这样的话

[Area("Dashboard")]
[Route("[area]/[controller]/[action]")]
public class HomeController : Controller
{
    // GET: Dashboard
    public ActionResult Index()
    {
        return View();
    }

如果您的目的是此套件,则可以完全省略[Route("[area]/[controller]/[action]")],因为这是默认约定。