ASP.NET根据参数

时间:2016-05-27 19:31:24

标签: asp.net-mvc routes

我正在尝试创建一个登录部分。首次启动页面时,您只需转到指定的网址/Login即可。当您提交并且凭据错误时,我想重定向到具有给定网址/Login/Error/{errorid}的登录页面。 因此,想法是每当将errorid参数添加到路由时它应该进入错误路由。否则采用默认路线。

但是我设置了以下路线,但它们似乎不起作用。注意:我确实稍微更改了默认控制器。

routes.MapRoute("Error", "{action}/Error/{errorid}",
    new { controller = "Login", action = "Login" }
);

routes.MapRoute("Default", "{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

此外,我有2个控制器。我的家庭控制器是登录页面以及登录控制器的位置。

启动应用程序时也出现错误。当它在索引操作中进行重定向时,它会说:

  

路由表中没有路由与提供的值匹配。

HomeController中:

public ActionResult Index()
{
    Session["User"] = -1;

    return RedirectToAction("Login", "Login");
}

的LoginController:

public ActionResult Login(int? errorid)
{
    if (Models.User.CheckActiveSession(Convert.ToInt32(Session["User"])))
    {
        return RedirectToAction("Overview", "Home");
    }

    return View();
}

public ActionResult ValidateLogin()
{
    if (Request.HttpMethod == "POST")
    {
        int userid = Models.User.CheckLogin(Request.Form["username"], Request.Form["password"]);

        if (userid != -1)
        {
            Session["User"] = userid;

            return RedirectToAction("Overview", "Home");
        }
    }

    return RedirectToAction("Login", "Login", new { errorid = 1 });
}

我不得不说我是新手,所以我不确定我是否正确这样做,但我已经阅读了一些如何做到这一点的指南。任何提示都表示赞赏。如果还有其他方法,我也很乐意听到这些。

编辑:

在自定义路线中犯了一个小错误。 errorid参数不在默认参数的对象中。如果我确实说errorid = 0,那么页面会加载,但我会看到网址/Login/Error

1 个答案:

答案 0 :(得分:1)

问题在于您的默认路线:

routes.MapRoute("Default", "{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

虽然您已指定提供默​​认controller"Home",但如果网址中未提供任何值,则表示您尚未提供在网址中提供{controller}的方法。这意味着除了controller之外,无法为"Home"指定任何内容。换句话说,使用此默认路由时无法访问LoginController

有很多方法可以解决这个问题(包括回到{controller}/{action}/{id}的原始网址),但这一切都取决于您决定首先从网址中删除控制器的原因。

  

在自定义路线中犯了一个小错误。 errorid参数不在默认参数的对象中。如果我确实说errorid = 0那么页面会加载,但我看到了网址/Login/Error

这不是错误。如果要在URL中创建必需值,则不得为其提供默认值。否则它将是可选的(意味着您可以将其从URL的右侧移开)。

要生成与Error路线匹配的网址,您需要为errorid提供一个值(因为它不是可选的)。

return RedirectToAction("Login", "Login", new { errorid = 123 });