这是学习MVC2和EF访问数据库后的第一个练习实例。实现的是对主题图片的增、删、改及显示的过程,下面是实现步骤和代码。
1:先创建一个mvc工程,打开VS2010,在File->New->Project... 在Visual C#下选中 ASP.NET MVC 2 Web Application 在对话框的Name栏目改名为ThemeMVC,存放目录自己可选。确定后一个带有模板的MVC框架就已经创建好了。
2:创建数据库,在Solution Explorer 栏目 ThemeMVC项目下的App_Data栏右击,选Add->New Item... 下的 SQL Server Datebase 改名字为ThemeDB 然后点击Add按钮,所添加的数据库ThemeDB就出现在App_Data下,双击ThemeDB,出现Server Explorer 框,在ThemeDB下的Tables 右击Create Table 创建一个Themes1的表,表的内容如图所示:
.
3:用EF关联所创建的数据库,进行数据映射。 在ThemeMVC项目上右击 Add->New Item.. 选ADO.NET Entity Data Model 改name 为ThemeModel.edmx 点Add添加。出现对话框choose model content,选generate from database 然后点击next,在与哪个数据库连接的对话框中选中ThemeDB.sdf数据库,在Web.Config 里面保存连接名为ThemeDBEntities1,然后点击Next,在这个对话框中选中要作出映射的数据库表,将Tables的Theme1表选中,然后finish结束。 这时在ThemeMVC项目下面多了一个ThemeModel.edmx文件,在ThemeModel.Designer.cs文件中默认生成了实体容器ThemeDBEntities和实体类Themes,
双击ThemeModel.edmx文件,所映射的实体属性如图所示
其中需要注意的是,实体类名默认是与数据库表名相同,我更改了Themes1为Themes。对应的改Name为Themes。Entity Set Name 为实体集的名称,一个实体集含有多个实体类,但是此实例中只有一张数据表。
其中映射表为下图所示:
4. 代码实现。
根据mvc的特性,在Controller下的HomeController页,先写一个构造函数,初始化实体容器实例。
ThemeDBEntities ThemeContext;
public HomeController()
{
ThemeContext = new ThemeDBEntities();
}
第一个页面,即启动页。从Global.asax.cs文件中可以改写启动也面。 默认为Home\Index。
2 {
3 publicstaticvoid RegisterRoutes(RouteCollection routes)
4 {
5 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
6
7 routes.MapRoute(
8 "Default", // Route name
9 "{controller}/{action}/{id}", // URL with parameters
10 new { controller ="Home", action ="Index", id = UrlParameter.Optional } // Parameter defaults
11 );
12
13 }
14
15 protectedvoid Application_Start()
16 {
17 AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting", true);
18
19 AreaRegistration.RegisterAllAreas();
20
21 RegisterRoutes(RouteTable.Routes);
22 }
23 }
添加Index.aspx页面。
2 {
3 ViewData.Model = ThemeContext.Themes.ToList(); //将实体类的记录值转变为强类型
4 ViewData["Path"] = ThemeContext.Themes.First().Theme_Path; //默认显示的图片路径为第一条记录的路径
5 return View("Index");
6 }
在Index()方法上右击,选Add View... 弹出的对话框如图,add添加即可,页面就存在于目录下Views->Home->Index.aspx (其他方法的页面也用此方法添加即可)
Index.aspx页面的代码。
2
3 <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
4 Home Page
5 </asp:Content>
6 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
7 <center>
8 <h2>
9 Theme 数据操作</h2>
10 </center>
11 <table border="1" width="100%" cellspacing="20pt" style="border-color: Gray">
12 <tr>
13 <th>
14 主题编号
15 </th>
16 <th>
17 主题名
18 </th>
19 <th>
20 主题存放路径
21 </th>
22 <th>
23 主题元素备注
24 </th>
25 <th>
26 主题应用IP
27 </th>
28 <th>
29 </th>
30 <th>
31 </th>
32 <th>
33 操作
34 </th>
35 </tr>
36 <%foreach (var m in ViewData.Model as List<ThemeMVC.Models.Themes>)
37 { %>
38 <tr>
39 <td>
40 <%=m.Theme_ID %>
41 </td>
42 <td>
43 <%=m.Theme_Name %>
44 </td>
45 <td>
46 <%=m.Theme_Path %>
47 </td>
48 <td>
49 <%=m.Theme_Note %>
50 </td>
51 <td>
52 <%=m.Theme_IP %>
53 </td>
54 <td>
55 <%=Html.ActionLink("编辑","Edit",new{ID=m.Theme_ID}) %>
56 </td>
57 <td>
58 <%=Html.ActionLink("删除","Delete",new{ID=m.Theme_ID}) %>
59 </td>
60 <td>
61 <%=Html.ActionLink("显示图片","Show",new{ID=m.Theme_ID}) %>
62 </td>
63 </tr>
64 <tr>
65 </tr>
66 <%} %>
67 <tr>
68 </tr>
69 </table>
70 <p style="text-align: center">
71 <%=Html.ActionLink("添加","Add") %></p>
72 <img width="100%" src='<%=ViewData["Path"] %>' alt="\image\A.jpg" height="200"/>
73 </asp:Content>
Edit.aspx页面的html代码
2 Edit
3 </asp:Content>
4
5 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
6 <script type="text/javascript">
7 function firm() {
8 var result = confirm("确定修改数据!");
9 if (result ==false) {
10 returnfalse;
11 }
12 elsereturntrue;
13 }
14
15 </script>
16 <form id="form1" runat='server' method="post">
17 <h2>Edit</h2>
18 <%=Html.Hidden("Theme_ID") %>
19 Theme_Name:<%=Model.Theme_Name %><br /><hr />
20 <%=Html.TextBox("Theme_Name")%><br /><hr />
21 Theme_Path:<%=Model.Theme_Path %><br /><hr />
22 <%=Html.TextBox("Theme_Path")%><br /><hr />
23 Theme_Note:<%=Model.Theme_Note %><br /><hr/>
24 <%=Html.TextBox("Theme_Note")%><br /><hr />
25 Theme_IP:<%=Model.Theme_IP %><br /><hr />
26 <%=Html.TextBox("Theme_IP")%><br /><hr />
27 <input type="submit" value="Edit" runat="server" onclick="return firm();"></form>
28 </asp:Content>
HomeController页面下的Edit方法:
2 {
3 var ThemeEdit =ThemeContext.Themes.First(m=>m.Theme_ID==ID);
4 return View(ThemeEdit);
5 }
2 public ActionResult Edit(int Theme_ID, FormCollection form) //FormCollection集合为Edit页面post提交的所有参数集合
3 {
4 Themes ThemeEdit = ThemeContext.Themes.First(m => m.Theme_ID == Theme_ID);
5 try
6 {
7 UpdateModel(ThemeEdit);
8 ThemeContext.SaveChanges();
9 return RedirectToAction("Page_Load", new { ThemeEdit.Theme_ID });
10 }
11 catch(Exception e)
12 {
13 ModelState.AddModelError("ThemeEdit.Theme_ID",e.Message);
14 }
15 return View("Index");
16 }
Add.aspx页面的html代码:
2 Add
3 </asp:Content>--%>
4
5 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
6
7 <h2>Add</h2>
8 <form id="form2" runat="server" method="post">
9 Theme_Name:<%=Html.TextBox("Theme_Name") %><hr />
10 Theme_Path:<%=Html.TextBox("Theme_Path") %><hr />
11 Theme_Note:<%=Html.TextBox("Theme_Note")%><hr />
12 Theme_IP:<%=Html.TextBox("Theme_IP")%><hr />
13 <input type="submit" value="Add"/>
14 </form>
15
16 </asp:Content>
在HomeController下的Add方法。
2 {
3 return View(); //默认为View("Add")
4 }
2 public ActionResult Add(FormCollection form)
3 {
4 Themes th =new Themes();
5 ObjectQuery<int> abq =new ObjectQuery<int>("select value Max(it.Theme_ID) from Themes as it", ThemeContext);
6 if (abq.Sum()==0)
7 {
8 th.Theme_ID =1;
9 }
10 else
11 {
12 th.Theme_ID = abq.Max() +1;
13 }
14
15 UpdateModel(th);
16 if (ModelState.IsValid)
17 {
18 ThemeContext.AddToThemes(th);
19 ThemeContext.SaveChanges();
20 return RedirectToAction("Page_Load", new {th.Theme_ID });
21 }
22 return View(abq);
23 }
在Index页面的Delete方法:
2 {
3 var ThemeDelete = ThemeContext.Themes.First(m => m.Theme_ID == ID);
4 ThemeContext.DeleteObject(ThemeDelete);
5 if (ModelState.IsValid)
6 {
7 ThemeContext.SaveChanges();
8 return RedirectToAction("Index");
9 }
10 else
11 return View(ThemeDelete);
12 }
在Index页面点击显示图片按钮时用到的show方法
2 {
3 var ThemeShow = ThemeContext.Themes.First(m => m.Theme_ID == ID);
4 ViewData["Path"] = ThemeShow.Theme_Path;
5 return Page_Load(ID);
6 }
2
3 public ActionResult Page_Load(int Theme_ID)
4 {
5 ViewData.Model = ThemeContext.Themes.ToList();
6 ViewData["Path"] = ThemeContext.Themes.First(m => m.Theme_ID == Theme_ID).Theme_Path;
7 return View("Index");
8 }
以上为该练习涉及到的所有代码,实现效果如下。
主页面图:
Add页面图:
Edit页面图:
到此已经完成了实例练习。