这是学习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。
代码
1 publicclassMvcApplication : System.Web.HttpApplication2 {3 publicstaticvoidRegisterRoutes(RouteCollection routes)4 {5 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");6 7 routes.MapRoute(8 "Default",//Route name9 "{controller}/{action}/{id}",//URL with parameters10 new{ controller="Home", action="Index", id=UrlParameter.Optional }//Parameter defaults11 );12 13 }14 15 protectedvoidApplication_Start()16 {17 AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting",true);18 19 AreaRegistration.RegisterAllAreas();20 21 RegisterRoutes(RouteTable.Routes);22 }23 }
添加Index.aspx页面。
代码
1 publicActionResult Index()2 {3 ViewData.Model=ThemeContext.Themes.ToList();//将实体类的记录值转变为强类型4 ViewData["Path"]=ThemeContext.Themes.First().Theme_Path;//默认显示的图片路径为第一条记录的路径5 returnView("Index");6 }
在Index()方法上右击,选Add View... 弹出的对话框如图,add添加即可,页面就存在于目录下Views->Home->Index.aspx (其他方法的页面也用此方法添加即可)
Index.aspx页面的代码。
代码
1 2 3 4 Home Page5 6 7
9 Theme 数据操作
1014 主题编号15 | 17 主题名18 | 20 主题存放路径21 | 23 主题元素备注24 | 26 主题应用IP27 | 29 | 31 | 33 操作34 |
---|---|---|---|---|---|---|---|
40 41 | 43 44 | 46 47 | 49 50 | 52 53 | 55 56 | 58 59 | 61 62 |
71
72Edit.aspx页面的html代码
代码
1 2 Edit3 4 5 6 16 17
Edit
18 19 Theme_Name:20
21 Theme_Path:
22
23 Theme_Note:
24
25 Theme_IP:
26
27 28
HomeController页面下的Edit方法:
1 publicActionResult Edit(intID)2 {3 var ThemeEdit=ThemeContext.Themes.First(m=>m.Theme_ID==ID);4 returnView(ThemeEdit);5 }
代码
1 [AcceptVerbs(HttpVerbs.Post)]//属性说明: 在Edit.aspx页面提交post后跳转到此方法2 publicActionResult Edit(intTheme_ID, FormCollection form)//FormCollection集合为Edit页面post提交的所有参数集合3 {4 Themes ThemeEdit=ThemeContext.Themes.First(m=>m.Theme_ID==Theme_ID);5 try6 {7 UpdateModel(ThemeEdit);8 ThemeContext.SaveChanges();9 returnRedirectToAction("Page_Load",new{ ThemeEdit.Theme_ID });10 }11 catch(Exception e)12 {13 ModelState.AddModelError("ThemeEdit.Theme_ID",e.Message);14 }15 returnView("Index");16 }
Add.aspx页面的html代码:
代码
1 2 Add3 --%>4 5 6 7
Add
8 9 Theme_Name:10 Theme_Path:
11 Theme_Note:
12 Theme_IP:
13 14 15 16
在HomeController下的Add方法。
1 publicActionResult Add()2 {3 returnView();//默认为View("Add")4 }
代码
1 [AcceptVerbs(HttpVerbs.Post)]2 publicActionResult Add(FormCollection form)3 {4 Themes th=newThemes();5 ObjectQueryabq=newObjectQuery("select value Max(it.Theme_ID) from Themes as it", ThemeContext);6 if(abq.Sum()==0)7 {8 th.Theme_ID=1;9 }10 else11 {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 returnRedirectToAction("Page_Load",new{th.Theme_ID });21 }22 returnView(abq);23 }
在Index页面的Delete方法:
代码
1 publicActionResult Delete(intID)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 returnRedirectToAction("Index");9 }10 else11 returnView(ThemeDelete);12 }
在Index页面点击显示图片按钮时用到的show方法
代码
1 publicActionResult Show(intID)2 {3 var ThemeShow=ThemeContext.Themes.First(m=>m.Theme_ID==ID);4 ViewData["Path"]=ThemeShow.Theme_Path;5 returnPage_Load(ID);6 }
代码
1 staticintNum;2 3 publicActionResult Page_Load(intTheme_ID)4 {5 ViewData.Model=ThemeContext.Themes.ToList();6 ViewData["Path"]=ThemeContext.Themes.First(m=>m.Theme_ID==Theme_ID).Theme_Path;7 returnView("Index");8 }
以上为该练习涉及到的所有代码,实现效果如下。
主页面图:
Add页面图:
Edit页面图:
到此已经完成了实例练习。