如何解决无法将其重定向到AfterLogin页面
UserController.cs
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(Customers customer)
{
if (ModelState.IsValid)
{
var obj = db.Customers.Where(a => a.Username.Equals(customer.Username) && a.Password.Equals(customer.Password)).FirstOrDefault();
if (obj != null)
{
Session["IC"] = obj.IC.ToString();
Session["Username"] = obj.Username.ToString();
return RedirectToAction("AfterLogin");
}
}
return View(customer);
}
public ActionResult AfterLogin()
{
if (Session["IC"] != null)
{
return View();
}
else
{
return RedirectToAction("Login");
}
}
Login.cshtml
@model LeafLife.Models.Customers
@{
ViewBag.Title = "Login";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Login</h2>
@using (Html.BeginForm("Login","User",FormMethod.Post))
{
<fieldset>
<legend>Mvc Simple Login Application Demo</legend>
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@if (@ViewBag.Message != null)
{
<div style="border: 1px solid red">
@ViewBag.Message
</div>
}
<table>
<tr>
<td>@Html.LabelFor(a => a.Username)</td>
<td>@Html.TextBoxFor(a => a.Username)</td>
<td>@Html.ValidationMessageFor(a => a.Username)</td>
</tr>
<tr>
<td>@Html.LabelFor(a => a.Password)</td>
<td>@Html.PasswordFor(a => a.Password)</td>
<td>@Html.ValidationMessageFor(a => a.Password)</td>
</tr>
<tr>
<td><input type="submit" value="Login" /></td>
</tr>
</table>
</fieldset>
}
Customers.cs
public class Customers
{
[Key]
public int IC { get; set; }
[Display(Name = "Username")]
[Required(AllowEmptyStrings = false,ErrorMessage = "Username required")]
public string Username { get; set; }
[Display(Name = "First Name")]
[Required(AllowEmptyStrings = false,ErrorMessage = "First name required")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
[Required(AllowEmptyStrings = false,ErrorMessage = "Last name required")]
public string LastName { get; set; }
[Display(Name = "Email Address")]
[Required(AllowEmptyStrings = false,ErrorMessage = "Email Address required")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Display(Name = "Date of birth")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true,DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DateofBirth { get; set; }
[Required(AllowEmptyStrings = false,ErrorMessage = "Password is required")]
[DataType(DataType.Password)]
[MinLength(6,ErrorMessage = "Minimum 6 characters required")]
public string Password { get; set; }
[Display(Name = "Confirm Password")]
[DataType(DataType.Password)]
[Compare("Password",ErrorMessage = "Confirm password and password do not match")]
public string ConfirmPassword { get; set; }
//ForeignKey
public int MembershipTypesId { get; set; }
[ForeignKey("MembershipTypesId")]
public MembershipTypes MembershipTypes { get; set; }
}
我测试了它,在我插入了必填字段之后,它只是停留在登录页面上。 经过多次测试,谷歌浏览器仅弹出一次保存密码通知。我以隐身模式再次测试它不会仅显示“登录”页面而无法登录。我再次尝试在Chrome上浏览,结果还是一样。
解决方法
如评论中所述,ModelState.IsValid
返回false
,这意味着LeafLife.Models.Customers
的某些属性未通过模型验证。
您之所以在登录页面上“卡住”,是因为经过评估后,Login()
方法的HttpPost版本看起来像这样:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(Customers customer)
{
if (ModelState.IsValid) // value is false so skip this block
{
// code here is not executed
}
return View(customer); // this shows the Login view
}
它仅返回登录视图。您需要找到有关ModelState.IsValid
返回false
的原因的根本原因。查看ModelState.Values
,并在集合中进行挖掘以查看是否存在模型错误。
Here's a good article解释了ModelState和模型验证。
编辑: 现在已经添加了Customer模型的代码,我建议使用View Models,而不是直接在View中使用数据模型。以下是一些正确的问题,可为您指明正确的方向:
What is difference between Model and ViewModel in asp.net core mvc?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。