[DbFirst验证]MVC2+EF实现简单的数据登陆和注册验证

  这部分学习的主要内容是实现登陆时的用户名及密码验证,注册信息验证。里面涉及到Strongly-Type HtmlHelper 强类型的HtmlHelper辅助方法,数据验证的方式等等。其中强类型辅助方法是通过lamda表达式引用模板中的模型来传到视图上的。下面是实现过程:

1:打开vs2010->New Project->mvc2 web application ,我给solution命名为MvcValidate,添加后工程就已经创建好了。

2:建立User sqlserver 数据库,表UserInfo如下:

3:EF实现存储模型到概念模型的映射。右击Model文件夹 Add New Item 添加Entity Data Model 取名为UserModel,这是出现UserModel.edmx文件,在他的设计文件UserModel.Designer.cs文件中的Entities部分。找到UserInfo这个类,即public partial class UserInfo : EntityObject 对所映射的字段加上[Display Name] 属性。(为了后面强类型Html.LabelFor可以直接读取到其值),如[DisplayName("用户名:")]。代码如下:

代码
  1  ///<summary>
  2  /// No Metadata Documentation available.
  3  ///</summary>
  4           [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
  5          [DataMemberAttribute()]
  6          [DisplayName("用户编号:")]
  7  publicglobal::System.Int32 UserID
  8          {
  9  get
 10              {
 11  return _UserID;
 12              }
 13  set
 14              {
 15  if (_UserID != value)
 16                  {
 17                      OnUserIDChanging(value);
 18                      ReportPropertyChanging("UserID");
 19                      _UserID = StructuralObject.SetValidValue(value);
 20                      ReportPropertyChanged("UserID");
 21                      OnUserIDChanged();
 22                  }
 23              }
 24          }
 25  privateglobal::System.Int32 _UserID;
 26  partialvoid OnUserIDChanging(global::System.Int32 value);
 27  partialvoid OnUserIDChanged();
 28      
 29  ///<summary>
 30  /// No Metadata Documentation available.
 31  ///</summary>
 32           [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
 33          [DataMemberAttribute()]
 34          [DisplayName("用户名:")]
 35  publicglobal::System.String UserName
 36          {
 37  get
 38              {
 39  return _UserName;
 40              }
 41  set
 42              {
 43                  OnUserNameChanging(value);
 44                  ReportPropertyChanging("UserName");
 45                  _UserName = StructuralObject.SetValidValue(value, false);
 46                  ReportPropertyChanged("UserName");
 47                  OnUserNameChanged();
 48              }
 49          }
 50  privateglobal::System.String _UserName;
 51  partialvoid OnUserNameChanging(global::System.String value);
 52  partialvoid OnUserNameChanged();
 53      
 54  ///<summary>
 55  /// No Metadata Documentation available.
 56  ///</summary>
 57           [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
 58          [DataMemberAttribute()]
 59          [DisplayName("用户地址:")]
 60  publicglobal::System.String UserAddress
 61          {
 62  get
 63              {
 64  return _UserAddress;
 65              }
 66  set
 67              {
 68                  OnUserAddressChanging(value);
 69                  ReportPropertyChanging("UserAddress");
 70                  _UserAddress = StructuralObject.SetValidValue(value, false);
 71                  ReportPropertyChanged("UserAddress");
 72                  OnUserAddressChanged();
 73              }
 74          }
 75  privateglobal::System.String _UserAddress;
 76  partialvoid OnUserAddressChanging(global::System.String value);
 77  partialvoid OnUserAddressChanged();
 78      
 79  ///<summary>
 80  /// No Metadata Documentation available.
 81  ///</summary>
 82           [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
 83          [DataMemberAttribute()]
 84          [DisplayName( "用户密码:")]
 85  publicglobal::System.String UserPwd
 86          {
 87  get
 88              {
 89  return _UserPwd;
 90              }
 91  set
 92              {
 93                  OnUserPwdChanging(value);
 94                  ReportPropertyChanging("UserPwd");
 95                  _UserPwd = StructuralObject.SetValidValue(value, false);
 96                  ReportPropertyChanged("UserPwd");
 97                  OnUserPwdChanged();
 98              }
 99          }
100  privateglobal::System.String _UserPwd;
101  partialvoid OnUserPwdChanging(global::System.String value);
102  partialvoid OnUserPwdChanged();
103      
104  ///<summary>
105  /// No Metadata Documentation available.
106  ///</summary>
107           [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
108          [DataMemberAttribute()]
109          [DisplayName("用户电话:")]
110  publicglobal::System.String UserPhone
111          {
112  get
113              {
114  return _UserPhone;
115              }
116  set
117              {
118                  OnUserPhoneChanging(value);
119                  ReportPropertyChanging("UserPhone");
120                  _UserPhone = StructuralObject.SetValidValue(value, false);
121                  ReportPropertyChanged("UserPhone");
122                  OnUserPhoneChanged();
123              }
124          }
125  privateglobal::System.String _UserPhone;
126  partialvoid OnUserPhoneChanging(global::System.String value);
127  partialvoid OnUserPhoneChanged();

3:实现代码。直接在HomeController.cs下初始化UserEntities实体容器。

public UserEntities userContext;
        
        public HomeController()
        {
            userContext = new UserEntities();
        }

   先创建一个登陆页面Login.aspx.  在HomeController.cs下添加代码

public ActionResult Login()
        {           
            return View();
        } 

然后在Login区域右击Add View添加Login.aspx页面,此处需要注意添加的是强类型Stongly Type view ,class选 MvcValidate.Models.UserInfo(如果不可选,可能是models 的namespace没在该页using,完后编译一下即可。我所碰到过的问题O(∩_∩)O~)

添加Login.aspx页的Html代码如下:

代码
 1  <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
 2  <h2>
 3          Login</h2>
 4  <center>
 5  <%using (Html.BeginForm())
 6            { %>
 7  <%=Html.ValidationSummary("请输入正确的用户名及密码,然后再试一次!") %>
 8  <fieldset style="width: 350px">
 9  <legend style="width: 350px; background: gray; display: block;">用户信息</legend>
10  <br />
11  <p>
12  <%=Html.LabelFor(m=>m.UserName)%>
13  <%=Html.TextBoxFor(m=>m.UserName) %>
14  <%=Html.ValidationMessageFor(m=>m.UserName,"*") %>
15  </p>
16  <p style="word-spacing: 1em">
17  <%=Html.LabelFor(m=>m.UserPwd)%><%=Html.PasswordFor(m=>m.UserPwd)%>
18  <%=Html.ValidationMessageFor(m=>m.UserPwd, "*")%></p>
19  <br />
20  </fieldset>
21  <p>
22  <input type="submit" value="submit"/>
23  <input type="reset" value="reset"/>
24             如果是未注册用户请先:<%=Html.ActionLink("Register", "Register")%></p>
25  <h2>
26  <p>
27  <%=ViewData["success"]%>
28  </p>
29  </h2>
30  <%} %></center>
31   </asp:Content>

Post提交后的控制页面的代码为:

代码
 1         [AcceptVerbs(HttpVerbs.Post)]
 2  public ActionResult Login(string UserName,string UserPwd,string UserPhone,string UserAddress,FormCollection from)
 3          {
 4  try
 5              {
 6  if (string.IsNullOrEmpty(UserName))
 7                  {
 8                      ModelState.AddModelError("UserName", "用户名不能为空");
 9                  }
10  if (string.IsNullOrEmpty(UserPwd))
11                  {
12                      ModelState.AddModelError("UserPwd", "用户密码不能为空");
13                  }
14  
15                  UserExist(UserName, UserPwd);
16  if (ModelState.IsValid)
17                  {                    
18                      ViewData["success"] ="登陆成功!";                   
19                  }
20  else
21                  {
22                      ViewData["success"] ="登陆失败!";                     
23                  }
24  return View();
25              }
26  catch 
27              {
28                  ViewData["success"] ="登陆失败!";
29  return View();
30              }
31          }

其中验证密码和用户名的函数UserExist的代码如下:

View Code
 1 代码
 2  publicvoid UserExist(string UserName,string UserPwd)
 3          {
 4              List<string> userstr =new List<string>();
 5              List<UserInfo> users =new List<UserInfo>();
 6              users = userContext.UserInfos.ToList();
 7              Dictionary<string, string> dicUser =new Dictionary<string, string>();
 8  foreach (var u in users)
 9              {
10                  userstr.Add(u.UserName.Trim());
11                  dicUser.Add(u.UserName.Trim(), u.UserPwd.Trim());
12              }
13  if (userstr.Contains(UserName))
14              {
15                  
16  if (dicUser[UserName]!= UserPwd){
17                  
18                      ModelState.AddModelError("UserPwd", "用户密码错误!");                    
19                  }
20                  
21              }
22  else
23              {
24                  ModelState.AddModelError("UserName", "用户名不存在");                
25              }
26          }

同样的方法添加Register.aspx注册页面,强类型才class也选MvcValidate.Models.UserInfo。 添加过程及代码为:

public ActionResult Register()
       {
           return View();
       }

View Code
 1 代码
 2  [AcceptVerbs(HttpVerbs.Post)]
 3  public ActionResult Register(string UserName, string UserPwd, string UserPhone, string UserAddress, FormCollection form)
 4         {
 5  if (string.IsNullOrEmpty(UserName))
 6             {
 7                 ModelState.AddModelError("UserName", "用户名不能为空");
 8             }
 9  if (string.IsNullOrEmpty(UserPwd))
10             {
11                 ModelState.AddModelError("UserPwd", "用户密码不能为空");
12             }           
13  if (string.IsNullOrEmpty(UserPhone))
14             {
15                 ModelState.AddModelError("UserPhone", "用户电话不能为空");
16             }
17  if (string.IsNullOrEmpty(UserAddress))
18             {
19                 ModelState.AddModelError("UserAddress", "用户地址不能为空");
20             }
21  if (ModelState.IsValid)
22             {
23                 UpdateModel(form);
24                 ViewData["Reg"] ="注册成功!";
25             }
26  else
27                 ViewData["Reg"] ="注册失败!";
28  return View(); 
29         }

Register页面的Html代码如下:

View Code
 1 代码
 2  <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
 3  <h2>注册用户</h2>
 4  <center>
 5  <%using (Html.BeginForm())
 6        { %>
 7  <%=Html.ValidationSummary("请确认您的信息然后再试一次!") %>
 8  <fieldset style=" width:350px">
 9  <legend style=" width:350px;background: gray;">用户注册信息</legend>
10  <p style="word-spacing: 1em">
11  <%=Html.LabelFor(m => m.UserName)%>
12  <%=Html.TextBoxFor(m=>m.UserName) %>
13  <%=Html.ValidationMessageFor(m => m.UserName, "*")%>
14  </p>
15  <p style="word-spacing: 1em">
16  <%=Html.LabelFor(m=>m.UserPwd)%>
17  <%=Html.PasswordFor(m => m.UserPwd)%>
18  <%=Html.ValidationMessageFor(m => m.UserPwd, "*")%></p>
19  <p>
20  <%=Html.LabelFor(m => m.UserPhone)%>
21  <%=Html.TextBoxFor(m => m.UserPhone)%>
22  <%=Html.ValidationMessageFor(m => m.UserPhone, "*")%></p>
23  <p>
24  <%=Html.LabelFor(m => m.UserAddress)%>
25  <%=Html.TextAreaFor(m=>m.UserAddress) %>
26  <%=Html.ValidationMessageFor(m => m.UserAddress, "*")%></p>
27  </fieldset>
28  <p>
29  <input type="submit" value="Register"/>
30  <input type="reset" value="reset"/>
31  </p>
32  <h2>
33  <p>
34  <%=ViewData["Reg"] %></p>
35  </h2>
36  <%} %></center>
37   </asp:Content>

 运行代码要改Global.asax下的routes.MapRoute的Action为Login,执行后的效果为:

Longin界面:

 校验后的错误信息显示界面:

如果登陆成功,则显示“登陆成功”

Register界面为:

Register错误信息界面:

验证的错误信息可不用显示在前页,可以显示在对应的文本框后面,取消Html.ValidatonSummary这句,然后在Html.ValidationMessage()中将*号去掉,这是会显示对应的错误信息

如:

posted @ 2013-04-06 10:56  derryliang  阅读(416)  评论(0)    收藏  举报