为什么我的视图在登录并重新打开页面时呈现登录页面?

时间:2013-11-28 06:48:33

标签: asp.net asp.net-mvc asp.net-mvc-routing

首先,我正在努力掌握路由的概念。我确实理解它的含义,但似乎无法理解发生了什么。

我正在开发一个ASP.NET Mvc5项目,其中登录页面是系统的一部分。第一次登录时,登录页面工作正常。但是,如果登录时我关闭浏览器并重新打开页面,它现在呈现主页面布局,登录页面为渲染体。

这些是我的routings

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

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

这是我的_ViewStart.cshtml

@{
    if (Request.IsAuthenticated)
    {
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    else
    {
        Layout = "~/Views/Shared/_AnonymousUserLayout.cshtml";
    }
}

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

您的路线是相同的,因此引擎使用与参数匹配的第一个路线 您应该仅为具有不同行为的控制器/操作定义新路由:

routes.MapRoute("ApplicationFetchBanner",
    "Application/FetchBanner/{fileName}",
    new
    {
        controller = "Application",
        action = "FetchBanner",
        fileName = ""
    }
);

在这里,我定义的路线只需要一个参数{fileName},其中controller/action是众所周知的。

要获得完整说明,您可以找到loads articles写的。{/ p>

如果要为页面定义不同的布局,最好的方法是告诉您查看要使用的布局。

如果我想在用户通过身份验证时使用特定的布局,我会像你一样创建两个布局。

_ViewStart.cshtml中定义的默认值应为:

@{
    Layout = "~/Views/Shared/_AnonymousUserLayout.cshtml";
}

然后在您的授权页面中我将定义要使用的布局。 您的Index.cshtml将使用非匿名布局:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

只需在页面开头使用此定义。

您可以使用操作/控制器上的[Authorize]属性或[AllowAnonymous]来控制控制器中的身份验证。

可以找到关于身份验证和授权的好文章here

更新:

我给了你最喜欢的选项,因为你可以控制每个视图。 另一种选择是自定义_ViewStart.cshtml

@{
    string layout = "";

    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        layout = "~/Views/Shared/_Layout.cshtml";
    }
    else
    {
        layout = "~/Views/Shared/_MyLayout.cshtml";
    }

    Layout = layout;
}

有第三种选择。您可以在控制器中渲染视图时指定布局:

return View("Index", "_AdminLayout", model);

...第四个包含_Layout.cshtml在控制器的文件夹中。