我有一个MVC应用程序,其主要路由定义如下:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Acesso", action = "Index", id = UrlParameter.Optional }
);
我的应用程序中有两个主要控制器:Access和Main。当用户进入应用程序时,它将像这样进入Access:
public ActionResult Index()
{
RepositorioAcesso repositorio = new RepositorioAcesso();
string login = System.Web.HttpContext.Current.User.Identity.Name.Split(new[] { "\\" }, StringSplitOptions.None)[1].ToLower();
Acesso acesso = repositorio.RecuperarAcesso(login, false);
if (acesso == null)
{
ViewBag.mensagem = "User Not Found.";
return View();
}
else
{
return RedirectToAction("Logando", "Acesso", new { @login = login });
}
}
这是Logando方法:
public RedirectToRouteResult Logando(string login)
{
RepositorioAcesso repositorio = new RepositorioAcesso();
RepositorioAgendamentosCliente repositorioAgendamentos = new RepositorioAgendamentosCliente();
Acesso acesso = repositorio.RecuperarAcesso(login, true);
Session.Timeout = 900;
Session["Login"] = acesso.Login;
Session["LoginCompleto"] = login.ToUpper();
Session["Nome"] = acesso.Nome;
Session["TipoMenu"] = ObterLayout(acesso);
Session["PaginaPrincipal"] = ObterPaginaPrincipal(acesso);
Session["Loja"] = acesso.Loja.LojaBase;
Session["ADABAS"] = acesso.Loja.LojaBase;
Session["Acesso"] = acesso;
return RedirectToAction("Index", "Principal");
}
我这样做是因为用户希望使用其Windows帐户信息登录。但是,如果用户最近是公司雇用的,则由于信息未更新,因此他/她不会出现在我们的记录中。因此,我首先检查它们是否在我们的数据库中。如果是,那么我会得到他们的信息。
有时,用户将直接访问用于Main / Index路由的应用程序,这将引发错误,因为将没有关于它们的会话信息。所以我做到了:
public ActionResult Index()
{
Session["lista"] = new List<Alta>();
Session["cliente"] = new Cliente();
Session["Configuracao"] = new ConfiguracaoLoja();
Acesso acesso = GetAcessoSession();
if (acesso == null)
{
return RedirectToAction("Index", "Acesso");
}
//rest of the code here
}
它能正常工作,但并非一直如此,因为我遇到了一些错误,要求我在web.config上打开自定义错误。 (由于我在10分钟前更改了Web配置,我仍然必须检查这些错误)。
是否有更有效的方法来检查是否存在有关用户的会话信息,并在需要时重定向它们?我正在使用asp.mvc 5 btw。