ASP.NET MVC3 快速入门-第九节 实现编辑、删除与明细信息视图

来源:互联网 发布:sql注入原理c 编辑:程序博客网 时间:2024/05/16 15:15

http://blog.csdn.net/zhanghuangbin/article/details/6864965

9.1 实现数据的明细信息视图

    首先,让我们来看一下如何实现一条数据的明细信息视图。为了更好地体会这一功能,首先我们在前文所述的电影清单视图(Views文件夹下面的Movies文件夹下面的Index.cshtml文件)中删除电影清单中的种类、票价、电影等级字段,使其代码如代码清单9-1中所示。

    代码清单9-1 修改后的Index.cshtml文件

[html] view plaincopyprint?
  1. @model IEnumerable<MvcMovie.Models.Movie>  
  2.   
  3. @{  
  4.   
  5.     ViewBag.Title = "电影清单";  
  6.   
  7. }  
  8.   
  9. <h2>我的电影清单</h2>  
  10.   
  11. <p>  
  12.   
  13.     @Html.ActionLink("追加", "Create")  
  14.   
  15. </p>  
  16.   
  17. <table>  
  18.   
  19.     <tr>  
  20.   
  21.         <th></th>  
  22.   
  23.         <th>  
  24.   
  25.             电影名称  
  26.   
  27.         </th>  
  28.   
  29.         <th>  
  30.   
  31.             发行日期  
  32.   
  33.         </th>  
  34.   
  35.     </tr>  
  36.   
  37. @foreach (var item in Model) {  
  38.   
  39.     <tr>  
  40.   
  41.         <td>  
  42.   
  43.             @Html.ActionLink("编辑", "Edit", new { id=item.ID }) |  
  44.   
  45.             @Html.ActionLink("查看明细", "Details", new { id=item.ID }) |  
  46.   
  47.             @Html.ActionLink("删除", "Delete", new { id=item.ID })  
  48.   
  49.         </td>  
  50.   
  51.         <td>  
  52.   
  53.             @item.Title  
  54.   
  55.         </td>  
  56.   
  57.         <td>  
  58.   
  59.             @String.Format("{0:d}", item.ReleaseDate)  
  60.   
  61.         </td>  
  62.   
  63.     </tr>  
  64.   
  65. }  
  66.   
  67. </table>  

    重新运行该应用程序,在浏览器中输入地址“http://localhost:xx/Movies”,浏览器中运行结果如图9-1所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

图9-1 修改后的电影清单画面

    现在电影清单画面中就只显示每条数据的电影名称与发行日期了,如果像查看该条数据的详细信息,需要点击每条数据的“查看明细”链接,将画面导航到明细数据画面,在该画面中查看这条数据的明细信息。当一条数据的细节信息比较多,而我们只想在该数据的列举清单中显示该数据的几个摘要信息,通过点击链接或按钮的操作来查看数据的细节信息时这种处理方法是比较有用的。

    接下来让我们来追加这个明细数据视图。首先打开Movie控制器,追加一个返回明细数据视图的Details方法,代码如下所示。

[csharp] view plaincopyprint?
  1. //   
  2.   
  3. // GET: /Movies/Details   
  4.   
  5. public ActionResult Details(int id)  
  6.   
  7. {  
  8.   
  9.     Movie movie = db.Movies.Find(id);  
  10.   
  11.     if (movie == null)  
  12.   
  13.         return RedirectToAction("Index");  
  14.   
  15.     return View("Details", movie);  
  16.   
  17. }  

    code-first通过使用Find方法来让一条数据的寻找变得非常容易。这个方法的一个非常重要的安全特性就是我们可以确保我们寻找的是一条可以被映射为Movie对象的数据。为什么这种做法可以确保安全性呢?举个例子来说,一个黑客可以将“http://localhost:xxxx/Movies/Details/1”地址修改为“http://localhost:xxxx/Movies/Details/12345”,如果数据库中没有这条id为12345的数据,根据以上代码所示,作为寻找结果的Movie对象将被设定为null,浏览器将重新返回显示电影清单画面。

    在Details方法中点击鼠标右键,选择“添加视图”,依然勾选“创建强类型视图”,模型类选择Movie,在支架模板中选择“Details”(明细数据),如图9-2所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

图9-2 添加明细数据视图

如果要创建中文网站或应用程序,则将默认生成的Details.cshtml文件中有关英文文字修改为中文,修改完毕后该文件中的代码如代码清单9-2中所示。

代码清单9-2 Details.cshtml文件(明细数据视图)中的代码

[html] view plaincopyprint?
  1. @model MvcMovie.Models.Movie  
  2.   
  3. @{  
  4.   
  5.     ViewBag.Title = "电影详细信息";  
  6.   
  7. }  
  8.   
  9. <h2>电影详细信息</h2>  
  10.   
  11. <fieldset>  
  12.   
  13.     <legend>电影</legend>  
  14.   
  15.     <div class="display-label">标题</div>  
  16.   
  17.     <div class="display-field">@Model.Title</div>  
  18.   
  19.     <div class="display-label">发行日期</div>  
  20.   
  21.     <div class="display-field">@String.Format("{0:d}",  
  22.   
  23. Model.ReleaseDate)</div>  
  24.   
  25.     <div class="display-label">种类</div>  
  26.   
  27.     <div class="display-field">@Model.Genre</div>  
  28.   
  29.     <div class="display-label">票价</div>  
  30.   
  31.     <div class="display-field">@String.Format("{0:c2}", Model.Price)</div>  
  32.   
  33.     <div class="display-label">等级</div>  
  34.   
  35.     <div class="display-field">@Model.Rating</div>  
  36.   
  37. </fieldset>  
  38.   
  39. <p>  
  40.   
  41.     @Html.ActionLink("编辑", "Edit", new { id=Model.ID }) |  
  42.   
  43.     @Html.ActionLink("返回电影清单", "Index")  
  44.   
  45. </p>   

    重新运行应用程序,在电影清单画面中点击某个电影的“查看明细”链接,浏览器显示画面如图9-3所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

图9-3 电影细节信息画面

9.2 实现数据的修改视图

    接下来,让我们来看一下如何实现一个用来修改数据的视图。

    首先打开Movie控制器,追加一个返回数据修改视图的Edit方法与一个对该视图中的表单提交进行处理的Edit方法,代码如下所示。

[csharp] view plaincopyprint?
  1. //   
  2.   
  3. // GET: /Movies/Edit   
  4.   
  5. public ActionResult Edit(int id)  
  6.   
  7. {  
  8.   
  9.         Movie movie = db.Movies.Find(id);  
  10.   
  11.         if (movie == null)  
  12.   
  13.             return RedirectToAction("Index");  
  14.   
  15.    
  16.   
  17.         return View(movie);  
  18.   
  19. }  
  20.   
  21. //   
  22.   
  23. // POST: /Movies/Edit   
  24.   
  25. [HttpPost]  
  26.   
  27. public ActionResult Edit(Movie model)  
  28.   
  29. {  
  30.   
  31.         try  
  32.   
  33.         {  
  34.   
  35.             var movie = db.Movies.Find(model.ID);  
  36.   
  37.    
  38.   
  39.             UpdateModel(movie);  
  40.   
  41.             db.SaveChanges();  
  42.   
  43.             return RedirectToAction("Details"new { id = model.ID });  
  44.   
  45.         }  
  46.   
  47.         catch (Exception)  
  48.   
  49.         {  
  50.   
  51.             ModelState.AddModelError("""修改失败,请查看详细错误信息。");  
  52.   
  53.         }  
  54.   
  55.    
  56.   
  57.         return View(model);  
  58.   
  59. }  

    这两个Edit方法中,第一个方法将在用户点击外部画面的“编辑”链接时被调用,用来在浏览器中显示数据修改视图,并且在该视图中显示用户选择编辑的数据。第二个Edit方法前面带有一个[HttpPost]标记,负责将修改数据视图中提交的表单数据绑定到一个用模型创建出来的Movie对象实例之上(当用户在表单中完成数据修改并点击保存按钮的时候进行提交),UpdateModel(movie)方法将调用模型拷贝器,该模型拷贝器将修改后的数据(使用model参数,该参数指向一个各属性值为编辑后数据的Movie对象实例)拷贝到数据库中(即为数据的保存过程)。在保存数据的过程中如果发生任何错误而导致保存失败的话,则画面重新返回到数据修改视图。

    接下来让我们来追加该数据修改视图、在Edit方法中点击鼠标右键,选择“添加视图”,依然勾选“创建强类型视图”,模型类选择Movie,在支架模板中选择“Edit”(修改数据),如图9-4所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

图9-4 追加数据修改视图

    如果要创建中文网站或应用程序,则将默认生成的Edit.cshtml文件中有关英文文字修改为中文,修改完毕后该文件中的代码如代码清单9-3中所示。

    代码清单9-3 Edit.cshtml文件(修改数据视图)中的代码

[html] view plaincopyprint?
  1. @model MvcMovie.Models.Movie  
  2.   
  3. @{  
  4.   
  5.     ViewBag.Title = "修改电影信息";  
  6.   
  7. }  
  8.   
  9. <h2>修改电影信息</h2>  
  10.   
  11. <script src="@Url.Content("~/Scripts/jquery.validate.min.js")"  
  12.   
  13. type="text/javascript"></script>  
  14.   
  15. <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"  
  16.   
  17. type="text/javascript"></script>  
  18.   
  19. @using (Html.BeginForm()) {  
  20.   
  21.     @Html.ValidationSummary(true)  
  22.   
  23.     <fieldset>  
  24.   
  25.         <legend>电影</legend>  
  26.   
  27.    
  28.   
  29.         @Html.HiddenFor(model => model.ID)  
  30.   
  31.    
  32.   
  33.         <div class="editor-label">  
  34.   
  35.             标题  
  36.   
  37.         </div>  
  38.   
  39.         <div class="editor-field">  
  40.   
  41.             @Html.EditorFor(model => model.Title)  
  42.   
  43.             @Html.ValidationMessageFor(model => model.Title)  
  44.   
  45.         </div>  
  46.   
  47.    
  48.   
  49.         <div class="editor-label">  
  50.   
  51.             发行日期  
  52.   
  53.         </div>  
  54.   
  55.         <div class="editor-field">  
  56.   
  57.             @Html.EditorFor(model => model.ReleaseDate)  
  58.   
  59.             @Html.ValidationMessageFor(model => model.ReleaseDate)  
  60.   
  61.         </div>  
  62.   
  63.    
  64.   
  65.         <div class="editor-label">  
  66.   
  67.             种类  
  68.   
  69.         </div>  
  70.   
  71.         <div class="editor-field">  
  72.   
  73.             @Html.EditorFor(model => model.Genre)  
  74.   
  75.             @Html.ValidationMessageFor(model => model.Genre)  
  76.   
  77.         </div>  
  78.   
  79.    
  80.   
  81.         <div class="editor-label">  
  82.   
  83.             票价  
  84.   
  85.         </div>  
  86.   
  87.         <div class="editor-field">  
  88.   
  89.             @Html.EditorFor(model => model.Price)  
  90.   
  91.             @Html.ValidationMessageFor(model => model.Price)  
  92.   
  93.         </div>  
  94.   
  95.    
  96.   
  97.         <div class="editor-label">  
  98.   
  99.             电影等级  
  100.   
  101.         </div>  
  102.   
  103.         <div class="editor-field">  
  104.   
  105.             @Html.EditorFor(model => model.Rating)  
  106.   
  107.             @Html.ValidationMessageFor(model => model.Rating)  
  108.   
  109.         </div>  
  110.   
  111.    
  112.   
  113.         <p>  
  114.   
  115.             <input type="submit" value="保存" />  
  116.   
  117.         </p>  
  118.   
  119.     </fieldset>  
  120.   
  121. }  
  122.   
  123. <div>  
  124.   
  125.     @Html.ActionLink("返回电影清单", "Index")  
  126.   
  127. </div>  

    重新运行应用程序,在电影清单画面中点击某个电影的“编辑”链接,浏览器显示画面如图9-5所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

图9-5 数据修改视图

    在该视图中修改选中的数据,然后点击保存按钮,浏览器将修改后的数据显示在明细数据视图中,如图9-6所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

图9-6 数据修改完成后被显示在明细数据视图中

9.3 实现数据的删除视图

    接下来,让我们来看一下如何实现一个用来删除数据的视图。

    首先打开Movie控制器,追加一个返回数据修改视图的Edit方法与一个对该视图中的表单提交进行处理的Edit方法,代码如下所示。

[csharp] view plaincopyprint?
  1. //   
  2.   
  3. //GET: /Movies/Delete   
  4.   
  5. public ActionResult Delete(int id)  
  6.   
  7. {  
  8.   
  9.     Movie movie = db.Movies.Find(id);  
  10.   
  11.     if (movie == null)  
  12.   
  13.         return RedirectToAction("Index");  
  14.   
  15.    
  16.   
  17.     return View(movie);  
  18.   
  19. }  
  20.   
  21. //   
  22.   
  23. // POST: /Movies/Delete  
  24.   
  25. [HttpPost]  
  26.   
  27. public RedirectToRouteResult Delete(int id,FormCollection collection)  
  28.   
  29. {  
  30.   
  31.     var movie = db.Movies.Find(id);  
  32.   
  33.     db.Movies.Remove(movie);  
  34.   
  35.     db.SaveChanges();  
  36.   
  37.     return RedirectToAction("Index");  
  38.   
  39. }  

    这里请注意第一个没有[HttpPost]标记的Delete方法并不会将数据删除,因为如果通过GET请求而删除(或者追加、修改)删除数据的话都会打开一个安全漏洞。

    接下来让我们来追加该数据删除视图、在Delete方法中点击鼠标右键,选择“添加视图”,依然勾选“创建强类型视图”,模型类选择Movie,在支架模板中选择“Delete”(删除数据),如图9-7所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

图9-7 追加数据删除视图

    如果要创建中文网站或应用程序,则将默认生成的Delete.cshtml文件中有关英文文字修改为中文,修改完毕后该文件中的代码如代码清单9-3中所示。

    代码清单9-3 Delete.cshtml文件(删除数据视图)中的代码

[html] view plaincopyprint?
  1. @model MvcMovie.Models.Movie  
  2.   
  3.    
  4.   
  5. @{  
  6.   
  7.     ViewBag.Title = "删除电影数据";  
  8.   
  9. }  
  10.   
  11.    
  12.   
  13. <h2>删除电影数据</h2>  
  14.   
  15.    
  16.   
  17. <h3>你确实想将这条电影数据删除吗?</h3>  
  18.   
  19. <fieldset>  
  20.   
  21.     <legend>电影</legend>  
  22.   
  23.    
  24.   
  25.     <div class="display-label">标题</div>  
  26.   
  27.     <div class="display-field">@Model.Title</div>  
  28.   
  29.    
  30.   
  31.     <div class="display-label">发行日期</div>  
  32.   
  33.     <div class="display-field">@String.Format("{0:d}",  
  34.   
  35. Model.ReleaseDate)</div>  
  36.   
  37.     <div class="display-label">种类</div>  
  38.   
  39.     <div class="display-field">@Model.Genre</div>  
  40.   
  41.     <div class="display-label">票价</div>  
  42.   
  43.     <div class="display-field">@String.Format("{0:F}", Model.Price)</div>  
  44.   
  45.     <div class="display-label">电影等级</div>  
  46.   
  47.     <div class="display-field">@Model.Rating</div>  
  48.   
  49. </fieldset>  
  50.   
  51. @using (Html.BeginForm()) {  
  52.   
  53.     <p>  
  54.   
  55.         <input type="submit" value="删除" /> |  
  56.   
  57.         @Html.ActionLink("返回电影清单", "Index")  
  58.   
  59.     </p>  
  60.   
  61. }   

在电影清单画面中点击一条数据的删除按钮,浏览器打开数据删除视图,如图9-8所示。

ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

 

图9-8 数据删除视图

    点击删除按钮,该条数据将被删除,浏览器中返回显示电影清单画面。

    最后,我们来回顾一下本教程中所讲述的内容。本教程中首先讲述了如何创建控制器、视图、如何将控制器中的数据传递给视图。然后我们设计并创建了一个数据模型。code-first根据模型在指定的数据库服务器中创建了一个数据库。我们可以从这个数据库中获取数据并显示在一个HTML表格中。然后我们追加了一个添加数据所用的视图。接下来我们通过添加一个数据列(也称字段)的方式来改变数据表,同时修改了数据清单画面与数据追加视图来显示这个新追加的数据列。然后我们通过使用DataAnnotations命名空间,为数据模型标注属性的方式来追加了一些数据验证规则。这些数据验证即可以在客户端实现,也可以在服务器端实现。最后,我们添加代码与视图模板来创建了数据的修改视图,删除视图与明细数据视图。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 写字楼保安夜班巡逻害怕怎么办 全民k歌歌曲删了怎么办 莲藕洞里的黑膜怎么办 鞋子后面的拉链磨脚怎么办 磨砂鞋尖踢掉皮怎么办 塔吊吊装过程中遇到障碍物怎么办 高速路上突然遇到障碍物怎么办 被不明物蛰了怎么办 喝酒后开车撞路政护栏怎么办 电脑过了质保期怎么办 电闸推不上去怎么办啊? 寝室的电闸不亮了怎么办 海绵城市改造只挖不修怎么办 怀孕一个月做了胸透怎么办 怀孕了照了胸透怎么办 刚怀孕照了胸透怎么办 怀孕进了ct室怎么办 消防稳压罐气囊压力不够怎么办 备孕期间拍了ct怎么办 晚上睡不好老做梦怎么办 零线和地线短路怎么办 火花塞拧的过紧怎么办 眼睛被电弧光灼伤怎么办 电脑模拟器微信附近人屏蔽了怎么办 美的电压锅漏气怎么办 电压力锅排气阀漏气怎么办 win10系统上不了网怎么办 手机自拍杆坏了怎么办 车辆遭核生化打击时怎么办? 遭核生化打击时怎么办? 车辆行驶中遭核生化打击时怎么办? 硫酸气体熏到嗓子怎么办 硫酸味儿进嗓子了怎么办 吸入二氧化氯气体后怎么办 衣服84消毒 变色了怎么办 我的身份证被诈骗犯知道了怎么办 母婴店来客人少怎么办 键盘驱动被卸载了怎么办 广州 狗狗随地大小便怎么办 上海 狗狗随地大小便怎么办 服装店人流量少生意差怎么办