如何从控制器正确返回视图?

时间:2018-04-29 14:31:57

标签: c# asp.net-mvc entity-framework

我有一个登录应用程序。我有一个控制器和一个视图。从控制器,我尝试确定用户是否是管理员,然后在视图中显示特定的消息。

问题是当我从Startup运行应用程序并按下登录按钮时,应用程序会将我重定向到主页。当我从视图中运行应用程序时,它可以工作(它很愚蠢,但它有效)。

我运行app prof启动时的链接:localhost:2627/Account/Login
我从视图中运行应用时的链接:localhost:2627/Account/LoginReturnUrl=%2FUsers%2FIndex

这是我的控制者:

public class UsersController : Controller
{
    // GET: Users
    [Authorize]
    public ActionResult Index()
    {
        if (User.Identity.IsAuthenticated)
        {
            var user = User.Identity;
            ViewBag.Name = user.Name;

            ViewBag.displayMenu = "No";

            if (isAdminUser())
            {
                ViewBag.displayMenu = "Yes";
            }
            return View();
        }
        else
        {
            ViewBag.Name = "Not Logged IN";
        }
        //return View();
        return View();

    }

这是我的观点:

  @{
        ViewBag.Title = "Index";
    }
    @if (ViewBag.displayMenu == "Yes")
    {
        <h1>Welcome Admin. Now you can create user Role.</h1>
        <h3>
            <li>@Html.ActionLink("Manage Role", "Index", "Role")</li>
        </h3>
    }
    else
    {
        <h2>  Welcome <strong>@ViewBag.Name</strong> :) .We will add user module soon </h2>
    }  

我试图关注this教程(登录部分)。 我无法弄清楚为什么它没有打开我的观点。用户已通过身份验证,但我只看到了主页视图。

我做错了什么?你有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

从用户视图启动应用程序时它的工作原因是您正在尝试访问受保护资源(即需要身份验证的资源)。当用户未被认证时,默认行为是挑战用户(即,认证用户)并且用户被重定向到登录页面。重定向用户时,正在设置returnUrl查询参数,以便在身份验证后可以将用户重定向回此资源。在这种情况下,returnUrl是用户的索引视图。

  

我从中运行应用时的链接   视图:本地主机:2627 /帐户/ LoginReturnUrl =%2FUsers%2FIndex

听起来您希望Users视图成为您的主页,或者至少是用户在登录后重定向到的页面。在AccountController中,如果这是所需的行为,您将需要强制执行此操作。

例如:

   switch (result)   
        {   
            case SignInStatus.Success:   
                return return RedirectToAction("Index", "Users");
             ...
       }

如果returnUrl也存在,您还需要注意。根据您的要求,您可能希望赋予returnUrl最高优先权。

            If ( SignInStatus.Success)
            {
                return !string.IsNullOrEmpty(returnUrl) ?
                       RedirectToLocal(returnUrl):
                       RedirectToAction("Index", "Users");
            }

基本上,它确实归结为您希望在身份验证后发送(aka route)用户的位置。也许用户偏好他们的主页,或者如果用户是管理员,你总是将他们路由到UsersController的索引视图。

在演示项目中,您应该查看Start.Auth.cs文件并熟悉身份验证选项。

例如,正在此文件中设置LoginPath。这是用户将被重定向到用于身份验证质询的路径。

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {...}

        });  

参考RedirectToAction:

http://msdn.microsoft.com/en-us/library/dd470594.aspx