我是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方法:
但是当点击F11时,它不会进入我的&#34; RedirectToDefault&#34;方法,它完成,但它只是刷新我的第一个登录视图。
答案 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
}