今天一直在上班,所以无法完成简易留言簿系统(Controller层)的代码,所以在工作之余看了看ASP.NET MVC与数据库,应该是比较旧的链接方式。
由于代码比较多,所以从工程里复制粘贴时,删除了一些创建类时系统自动生成的代码。代码仅供参考。
首先,在SQL Management Studio中创建一个数据库和相应的Table。
例如:
1 CREATE TABLE Users( 2 [Id] [int] IDENTITY(1,1) NOT NULL, 3 [Email] [nvarchar](max) NOT NULL, 4 [NickName] [nvarchar](10) NOT NULL, 5 [Password] [nvarchar](10) NOT NULL, 6 [CreatOn] [datetime] NOT NULL, 7 ) 8 9 GO
然后,完成“Web-config”中的代码:
<connectionStrings> <add name="BbsConnection" connectionString="Data Source=服务器名称;Initial Catalog=数据库名称;User ID=xx; Password=xxxxxx" providerName="System.Data.SqlClient"/> </connectionStrings>
其次,在Model层中建立一个名为BbsContext,并且引用 System.Data, System.Data.SqlClient, System.Configuration 三个命名空间。代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; using System.Configuration; using System.Data; namespace MvcBBSApplication.Models { public class BBSconnect { protected SqlConnection conn; public void OpenConnection() { conn = new SqlConnection(ConfigurationManager.ConnectionStrings["BbsConnection"].ConnectionString); try { if (conn.State.ToString()!="Open") { conn.Open(); } } catch (SqlException ex) { throw ex; } } public void CloseConnection() { try { conn.Close(); } catch (SqlException ex) { throw ex; } } //Insert public int InsertData(string sql) { int i = 0; try { if (conn.State.ToString()=="Open") { SqlCommand cmd = new SqlCommand(sql, conn); i = cmd.ExecuteNonQuery(); } return i; } catch (Exception ex) { throw ex; } } //serach public DataSet List(string sql) { try { SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(sql, conn); DataSet ds = new DataSet(); da.Fill(ds); return ds; } catch (Exception ex) { throw ex; } } //Detail public DataTable Detail(string sql) { try { SqlDataAdapter da = new SqlDataAdapter(sql, conn); DataSet ds = new DataSet(); da.Fill(ds); return ds.Tables[0]; } catch (Exception ex) { throw ex; } } //Delete public int Delete(string sql) { try { int result = 0; SqlCommand cmd = new SqlCommand(sql, conn); result = cmd.ExecuteNonQuery(); return result; } catch (Exception ex) { throw ex; } } } }
接下来,在Model层建立一个Model模型 User,代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; using System.ComponentModel; namespace MvcBBSApplication.Models { public class User { [Key] public int Id { get; set; } [DisplayName("UserName")] [Required(ErrorMessage = "Please enter the Email")] [DataType(DataType.EmailAddress, ErrorMessage = "Please enter the correct format")] public string Email { get; set; } [DisplayName("NickName")] [Required(ErrorMessage = "Please enter the NickName")] [MaxLength(10, ErrorMessage = "MaxLength 20 words")] public string NickName { get; set; } [DisplayName("Password")] [Required(ErrorMessage = "Please enter the Password")] [MaxLength(10, ErrorMessage = "MaxLength 10 words")] [DataType(DataType.Password)] public string Password { get; set; } [DisplayName("CreatOn")] [Required] public DateTime CreatOn { get; set; } } }
下来轮到 Controller层,在该层建立一个名为UserController的控制器。在控制器中引用 System.Data 命名空间。代码如下:
namespace MvcBBSApplication.Controllers { public class UserController : Controller { BBSconnect bbs = new BBSconnect(); public ActionResult Register() { return View(); } [HttpPost] public ActionResult Register(User user) { if (ModelState.IsValid) { bbs.OpenConnection(); string sql = "insert into Users(Email,NickName,Password,CreatOn) values('" + user.Email + "','" + user.NickName + "','" + user.Password + "','" + DateTime.Now + "')"; int result = bbs.InsertData(sql); if (result > 0) { ModelState.AddModelError("success", "ok"); } else { ModelState.AddModelError("error", "Failure"); } bbs.CloseConnection(); return RedirectToAction("Register", "User"); } else { return View(); } } public ActionResult UserList(int id) { bbs.OpenConnection(); DataSet ds = new DataSet(); string sql = "SELECT * FROM USERS"; if (id != 0) { sql = sql + " WHERE id = " + id + ""; } ds = bbs.List(sql); DataTable dt = ds.Tables[0]; bbs.CloseConnection(); return View(dt); } public ActionResult UserDetail(int id) { bbs.OpenConnection(); string sql = "SELECT * FROM USERS WHERE ID = " + id + ""; DataTable dt = bbs.Detail(sql); bbs.CloseConnection(); return View(dt); } [HttpPost] public ActionResult RemoveUser(int id) { bbs.OpenConnection(); string sql = "DELETE FROM USERS WHERE ID=" + id + ""; int result = 0; if (id != 0) { result = bbs.Delete(sql); bbs.CloseConnection(); return RedirectToAction("UserList", "User"); } else { bbs.CloseConnection(); return RedirectToAction("Register", "User"); } } } }
最后view层分别是 UserList, Register 与 UserDetail三个简单的页面。
Register页面代码:
@model MvcBBSApplication.Models.User <h2>Register</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary(true) <fieldset> <legend>User</legend> <div class="editor-label"> @Html.LabelFor(model => model.Email) </div> <div class="editor-field"> @Html.EditorFor(model => model.Email) @Html.ValidationMessageFor(model => model.Email) </div> <div class="editor-label"> @Html.LabelFor(model => model.NickName) </div> <div class="editor-field"> @Html.EditorFor(model => model.NickName) @Html.ValidationMessageFor(model => model.NickName) </div> <div class="editor-label"> @Html.LabelFor(model => model.Password) </div> <div class="editor-field"> @Html.EditorFor(model => model.Password) @Html.ValidationMessageFor(model => model.Password) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } <div> @Html.ActionLink("back to list", "UserList","User") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
UserList页面代码:
@model System.Data.DataTable @{ var ajaxOption = new AjaxOptions() { OnSuccess = "RemoveUserSuccess", OnFailure = "RemoveUserFailure", Confirm = "Are you sure Remove?", HttpMethod = "Post" }; } @section scripts{ @Scripts.Render("~/bundles/jqueryval") <script> function RemoveUserSuccess() { alert('Remove Success'); location.reload(); } function RemoveUserFailure(xhr) { alert('Remove Failure:' + xhr.statue + ' '); } </script> } <h2>UserList</h2> <p> @Html.ActionLink("Create New", "Register","User") </p> <table> <tr> @foreach (System.Data.DataColumn col in Model.Columns) { <th>@col.Caption</th> } <th>操作</th> </tr> @foreach (System.Data.DataRow row in Model.Rows) { <tr> @foreach (var cell in row.ItemArray) { <td> @cell.ToString() </td> } <td> @Html.ActionLink("Detail", "UserDetail", new { id = row["Id"] }) </td> <td> @Ajax.ActionLink("Delete", "RemoveUser", new { id = row["Id"] },ajaxOption) </td> </tr> } </table>
UserDetail页面代码:
@model System.Data.DataTable <h2>UserDetail</h2> <fieldset> <legend>User</legend> <div class="display-label"> Email </div> <div class="display-field"> @Model.Rows[0]["Email"] </div> <div class="display-label"> NickName </div> <div class="display-field"> @Model.Rows[0]["NickName"] </div> <div class="display-label"> Password </div> <div class="display-field"> @Model.Rows[0]["Password"] </div> <div class="display-label"> CreatOn </div> <div class="display-field"> @Model.Rows[0]["CreatOn"] </div> </fieldset> <p> @Html.ActionLink("Back to List", "UserList","User") </p>
以上就是ASP.NET MVC 与数据库交互的一种方式。删除,列表,详细页,注册功能都可以实现。但是搜索功能还没有实现。应该如何实现,将在后续的学习中加上。明天继续完成简易留言簿系统的controller层。