VS2015用向导生成的MVC代码是自带一个AccountControl的和ManagerControl,但是对应的类和我原来数据库的数据不匹配,自带不记录手机号、电子邮件地址等,就想弄一个简单的自用,而且能和系统原来的数据结合。参考该博客,感谢原作者。下面记录一下步骤。
用向导生成一个不带Form验证的MVC页面(生成带Form验证的我暂时没改成功,太复杂了,也暂时不需要那么多)。
- web.config中添加验证
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" defaultUrl="~/Home/Index" protection="All" />
</authentication>
.....
.....
</system.web>
- 增加相应模型
Models目录下增加以下3个模型
LoginViewModel
public class LoginViewModel
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "密码")]
public string Password { get; set; }
[Display(Name = "记住我?")]
public bool RememberMe { get; set; }
[Required]
[Display(Name = "用户名")]
public string UserName { get; set; }
}
User
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public string[] Roles { get; set; }
}
UserRepository
public bool ValidateUser(string name, string password)
{
Mydata data= new Mydata(name);//这里是自己原始数据库的数据
if (stu == null) return false;
if (stu.Password != password) return false;
else return true;
}
public string[] GetRoles(string userName)
{
return new string[] { };//我的原始数据没有这一项,返回空数组
}
public User GetByStunumAndPassword(string name, string password)
{
Mydata data= new Mydata(name);//这里是自己原始数据库的数据
if (data== null) return null;
if (data.Password != password) return null;
else
{
User usr= new User();
usr.ID = data.Id;
usr.Name = data.Name;
usr.Password = data.Password;
usr.Roles = new string[] { };
return usr;
}
}
- 增加验证事件
修改Global.asax
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
//以下为新增部分
public MvcApplication()
{
AuthenticateRequest += new EventHandler(MvcApplication_AuthorizeRequest);
}
void MvcApplication_AuthorizeRequest(object sender, EventArgs e)
{
if (Context.User != null)//参考博客中没有这一句,但是我生成后会报错,所以加了这句,如果有人知道原因麻烦留言
{
IIdentity id = Context.User.Identity;
if (id.IsAuthenticated)
{
var roles = new Models.UserRepository().GetRoles(id.Name);
Context.User = new GenericPrincipal(id, roles);
}
}
}
}
- 增加相应的AccountControl控制器和视图
这一部分都是抄作业了。
控制器
public class AccountController : Controller
{
private UserRepository repository = new UserRepository();
/*public AccountController()
{
}*/
public ActionResult Login(string returnUrl)
{
ViewBag.returnUrl = returnUrl;
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (repository.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (!String.IsNullOrEmpty(returnUrl)) return Redirect(returnUrl);
else return RedirectToAction("About", "Home");
}
else
ModelState.AddModelError("", "用户名或密码不正确!");
}
return View(model);
}
//
// POST: /Account/LogOff
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home");
}
}
视图
@using StudentMVCWithoutAuth.Models
@model LoginViewModel
@{
ViewBag.Title = "登录";
}
<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>使用本地帐户登录。</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.UserName, "", 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="登录" class="btn btn-default" />
</div>
</div>
}
</section>
</div>
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
- 引用中添加Microsoft.AspNet.Identity.Core
直接用NuGet搜索Microsoft.AspNet.Identity.Core然后添加到项目中。
先写那么多,继续测试,如果发现bug,再改本文。