我正在尝试创建一个登录部分。首次启动页面时,您只需转到指定的网址/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
。
答案 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 });