RedirectToAction MVC5不起作用

时间:2015-03-17 11:31:37

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

我是Asp.Net MVC的新手,很抱歉,如果它看起来微不足道。

我遵循本教程:http://techbrij.com/custom-roleprovider-authorization-asp-net-mvc

我遇到RedirectToAction方法的问题,我在登录操作之后调用它:

        // POST: /Account/Login
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public  ActionResult Login(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                using (AferSuiviDBEntities objContext = new AferSuiviDBEntities())
                {
                    var objUser = objContext.People.FirstOrDefault(x => x.CompanyMail == model.Email && x.CompanyPassword == model.Password);
                    if (objUser == null)
                    {
                        ModelState.AddModelError("LogOnError", "The user name or password provided is incorrect.");
                    }
                    else
                    {
                        FormsAuthentication.SetAuthCookie(model.Email, model.RememberMe);
                        Session["MyMenu"] = null;
                        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                           && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                        {
                            return Redirect(returnUrl);
                        }
                        else
                        {

                            return RedirectToAction("RedirectToDefault");
                        }
                    }
                }
            }
            // If we got this far, something failed, redisplay form
            return View(model);
        }

我写了一个RedirectToDefault方法,检查记录的用户并显示相应的页面:

        public ActionResult RedirectToDefault()
        {

            String[] roles = Roles.GetRolesForUser();
            if (roles.Contains("Administrator"))
            {
                return RedirectToAction("Index", "Home");
            }
            else if (roles.Contains("Engineer"))
            {
                return RedirectToAction("Index", "Engineer");
            }
            else if (roles.Contains("PublicUser"))
            {
                return RedirectToAction("Index", "PublicUser");
            }
            else
            {
                return RedirectToAction("Index");
            }
        }

我的routeConfigfile如下:

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

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
            );
        }
    }

问题在于,当我设置凭据然后点击"登录"按钮,它来自这个网址:

http://localhost:3343/Account/Login

到这一个:

http://localhost:3343/Account/Login?ReturnUrl=%2FAccount%2FRedirectToDefault

但登录页面仍然显示!谁能解释为什么请你?

PS:我在RedirectToDefault方法中放了一个断点,我发现它没有进入里面!

更新

我的登录视图:

@model LoginViewModel
@{
    ViewBag.Title = "Log in";
}

<h2>@ViewBag.Title.</h2>
<div class="row">
    <div class="col-md-8">
        <section id="loginForm">
            @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
            {
                @Html.AntiForgeryToken()
                <h4>Use a local account to log in.</h4>
                <hr />
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                <div class="form-group">
                    @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <div class="checkbox">
                            @Html.CheckBoxFor(m => m.RememberMe)
                            @Html.LabelFor(m => m.RememberMe)
                        </div>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Log in" class="btn btn-default" />
                    </div>
                </div>
                <p>
                    @Html.ActionLink("Register as a new user", "Register")
                </p>
                @* Enable this once you have account confirmation enabled for password reset functionality
                    <p>
                        @Html.ActionLink("Forgot your password?", "ForgotPassword")
                    </p>*@
            }
        </section>
    </div>
    <div class="col-md-4">
        <section id="socialLoginForm">
            @Html.Partial("_ExternalLoginsListPartial", new ExternalLoginListViewModel { ReturnUrl = ViewBag.ReturnUrl })
        </section>
    </div>
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

更新2

这是我的代码的图像,它表明该过程实际上是我的RedirectToAction方法:

enter image description here

但是当点击F11时,它不会进入我的&#34; RedirectToDefault&#34;方法,它完成,但它只是刷新我的第一个登录视图。

2 个答案:

答案 0 :(得分:0)

你没有打电话给你的方法。这一行

                    else
                    {

                        return RedirectToAction("RedirectToDefault");
                    }

应该是

                    else
                    {

                        return RedirectToDefault();
                    }           

答案 1 :(得分:0)

您的登录Get方法应该是这样的

[HttpGet]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

和Login Post方法与您编码的相同。

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public  ActionResult Login(LoginViewModel model, string returnUrl)
{
  if (ModelState.IsValid)
        {
            using (AferSuiviDBEntities objContext = new AferSuiviDBEntities())
            {
                var objUser = objContext.People.FirstOrDefault(x => x.CompanyMail == model.Email && x.CompanyPassword == model.Password);
                if (objUser == null)
                {
                    ModelState.AddModelError("LogOnError", "The user name or password provided is incorrect.");
                }
                else
                {
                    FormsAuthentication.SetAuthCookie(model.Email, model.RememberMe);
                    Session["MyMenu"] = null;
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                       && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {

                        return RedirectToAction("RedirectToDefault");
                    }
                }
            }
        }
        // If we got this far, something failed, redisplay form
        return View(model);
}

和表格标签如

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
    {   
        // html for login form
    }