在这节课程中,你将查看为影片控制器生成的方法和视图。

运行程序,在浏览器中访问/Movies。鼠标悬停在影片列表某条记录的Edit链接上方,会看到链接类似于http://localhost:5279/Movies/Edit/1。

Edit的链接是由Views\Movies\Index.cshtml文件中的Html.ActionLink方法生成的,如下所示:@Html.ActionLink("Edit", "Edit", new { id=item.ID })

Html对象是System.Web.Mvc.WebViewPage基类暴露出来的一个属性,作为助手来使用。助手的ActionLink方法令动态生成与控制器中的方法关联的HTML超链接变得容易。ActionLink的第一个参数是显示的文本(例如,<a>编辑</a>)。第二个参数是要调用的方法名。最后一个参数是生成的匿名路由数据对象(在这个例子中,是指值为1的ID)。

在上面生成的链接地址是http://localhost:5279/Movies/Edit/1。默认路由(在App_Start\RouteConfig.cs中创建)解析URL的模式为{controller}/{action}/{id}。因此,ASP.NET将http://localhost:5279/Movies/Edit/1转换成Movies控制器的Edit方法的请求,并携带一个值为1参数ID。在App_Start\RouteConfig.cs文件中查看以下代码:

    public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}}

你也可以使用查询字符串来传递方法参数。例如,http://localhost:5279/Movies/Edit?ID=1同样传递值为1的ID参数给Movies控制器的Edit方法。

打开Movies控制器文件。两个Edit方法如下所示:

        //// GET: /Movies/Edit/5public ActionResult Edit(int id = 0){Movie movie = db.Movies.Find(id);if (movie == null){return HttpNotFound();}return View(movie);}//// POST: /Movies/Edit/5
        [HttpPost]public ActionResult Edit(Movie movie){if (ModelState.IsValid){db.Entry(movie).State = EntityState.Modified;db.SaveChanges();return RedirectToAction("Index");}return View(movie);}

注意第二个Edit方法前面加了HttpPost属性。该属性指定这个重载的Edit方法仅在接受Post请求时被调用。你可以将HttpGet属性应用在第一个Edit方法,但那不是必须的,因为它是默认的。(我们将为HttpGet方法隐性地指定HttpGet属性)。
HttpGet属性的Edit方法获取影片ID参数,使用Entity Framework的Find方法查找影片,并返回选中的影片给Edit视图。当Edit方法被调用时没有参数传入时,ID参数指定0作为默认值。当无法找到影片时,返回HttpNotFound。当脚手架系统创建Edit视图时,查看Movie类并为该类的每个属性创建<label>和<input>元素。下面的例子展示了生成的Edit视图:

@model MvcMovie.Models.Movie@{ViewBag.Title = "Edit";
}<h2>Edit</h2>@using (Html.BeginForm()) {@Html.ValidationSummary(true)<fieldset><legend>Movie</legend>@Html.HiddenFor(model => model.ID)<div class="editor-label">@Html.LabelFor(model => model.Name)</div><div class="editor-field">@Html.EditorFor(model => model.Name)@Html.ValidationMessageFor(model => model.Name)</div><div class="editor-label">@Html.LabelFor(model => model.Genra)</div><div class="editor-field">@Html.EditorFor(model => model.Genra)@Html.ValidationMessageFor(model => model.Genra)</div><div class="editor-label">@Html.LabelFor(model => model.Price)</div><div class="editor-field">@Html.EditorFor(model => model.Price)@Html.ValidationMessageFor(model => model.Price)</div><div class="editor-label">@Html.LabelFor(model => model.Date)</div><div class="editor-field">@Html.EditorFor(model => model.Date)@Html.ValidationMessageFor(model => model.Date)</div><p><input type="submit" value="Save" /></p></fieldset>
}<div>@Html.ActionLink("Back to List", "Index")
</div>@section Scripts {@Scripts.Render("~/bundles/jqueryval")
}

注意该视图模板在文件顶部有@model MvcMovie.Models.Movie语句--指定了视图期望的模型是Movie类型。
脚手架代码使用几个Helper方法来生成流式的Html标记。Html.LabelFor显示字段名称(片名、价格、风格等)。Html.EditorFor生成<input>元素。Html.ValidationMessageFor展示与属性关联的验证信息。
运行程序,导航到/Movies 地址。点击Edit超链接。在浏览器中查看页面源代码。表单元素的Html源码如下所示:

<!DOCTYPE html>
<html lang="zh"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta charset="utf-8" /><title>Edit - 电影应用程序</title><link href="/favicon.ico" rel="shortcut icon" type="image/x-icon" /><meta name="viewport" content="width=device-width" /><link href="/Content/site.css" rel="stylesheet"/><script src="/Scripts/modernizr-2.5.3.js"></script></head><body><header><div class="content-wrapper"><div class="float-left"><p class="site-title"><a href="/">MVC 电影</a></p></div><div class="float-right"><section id="login"><ul><li><a href="/Account/Register" id="registerLink">注册</a></li><li><a href="/Account/Login" id="loginLink">登录</a></li></ul></section><nav><ul id="menu"><li><a href="/">主页</a></li><li><a href="/Home/About">关于</a></li><li><a href="/Home/Contact">联系方式</a></li></ul></nav></div></div></header><div id="body"><section class="content-wrapper main-content clear-fix"><h2>Edit</h2><form action="/Movies/Edit/1" method="post">    <fieldset><legend>Movie</legend><input data-val="true" data-val-number="字段 ID 必须是一个数字。" data-val-required="ID 字段是必需的。" id="ID" name="ID" type="hidden" value="1" /><div class="editor-label"><label for="Name">Name</label></div><div class="editor-field"><input class="text-box single-line" id="Name" name="Name" type="text" value="少年派的奇幻之旅" /><span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span></div><div class="editor-label"><label for="Genra">Genra</label></div><div class="editor-field"><input class="text-box single-line" id="Genra" name="Genra" type="text" value="冒险" /><span class="field-validation-valid" data-valmsg-for="Genra" data-valmsg-replace="true"></span></div><div class="editor-label"><label for="Price">Price</label></div><div class="editor-field"><input class="text-box single-line" data-val="true" data-val-number="字段 Price 必须是一个数字。" data-val-required="Price 字段是必需的。" id="Price" name="Price" type="text" value="60.96" /><span class="field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span></div><div class="editor-label"><label for="Date">Date</label></div><div class="editor-field"><input class="text-box single-line" data-val="true" data-val-date="字段 Date 必须是日期。" data-val-required="Date 字段是必需的。" id="Date" name="Date" type="datetime" value="2012/12/5 0:00:00" /><span class="field-validation-valid" data-valmsg-for="Date" data-valmsg-replace="true"></span></div><p><input type="submit" value="Save" /></p></fieldset>
</form>
<div><a href="/Movies">Back to List</a>
</div></section></div><footer><div class="content-wrapper"><div class="float-left"><p>&copy; 2012 - 我的 ASP.NET MVC 应用程序</p></div></div></footer><script src="/Scripts/jquery-1.7.1.js"></script><script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script></body>
</html>

包含<input>元素的HTML <form> 元素的action属性设置为/Movies/Edit ,方法为post。点击Edit按钮,表单数据将被post到服务器。
处理Post请求

下面列表显示了处理HttpPost请求版本的Edit方法

        //// POST: /Movies/Edit/5
        [HttpPost]public ActionResult Edit(Movie movie){if (ModelState.IsValid){db.Entry(movie).State = EntityState.Modified;db.SaveChanges();return RedirectToAction("Index");}return View(movie);}

ASP.NET MVC模型绑定机制获取post表单值,创建Movie对象作为参数。ModelState.IsValid方法验证表单提交的数据可以用来修改(编辑或更新)Movie对象。如果数据有效,则影片数据将被保存到MovieDbContext实例集合中。新的影片数据在调用MovieDbContext的SaveChanges时保存到数据库。保存完数据后,代码引导用户到MoviesController 的Index方法,在那展示包括刚刚修改的影片在内的影片集合。
如果post的数据无效,将在表单中重新显示。Edit.cshtml视图模板中的Html.ValidationMessageFor助手负责显示错误信息。

译者注:原文在该部分有大量篇幅提示在非英语母语国家,使用逗号来替代货币中的小数点,来实现JQuery正确验证数据的目的,与主题无关,在此做删节处理,有兴趣的可以阅读英文原文。

所有的HttpGet方法遵循相似的模式。获取一个movie对象(或者对象集合,比如在Index例子中),从模型传递到视图。Create方法传递空对象给Create视图。创建、编辑、删除或者修改数据等所有操作放在HttpPost重载方法中。在HttpGet方法中修改数据存在安全隐患,详细信息请查看ASP.NET MVC Tip #46 – Don’t use Delete Links because they create Security Holes。在Get方法中修改数据同样违法Http最佳实践以及Rest模式(指定Get请求不应当变更你的应用程序状态)。换句话说,执行Get操作应该是一个不影响以及不会修改此前数据的安全操作。

咋看的有点累呢,没有WEB开发基础,看起来是有点小痛苦滴,没办法,加油!

Asp.Net MVC4.0 官方教程 入门指南之六--查看Edit方法和Edit视图相关推荐

  1. Asp.Net MVC4.0 官方教程 入门指南之一-- 入门介绍

    本教程将为您讲解使用微软的Visual Studio  2012 来建立一个ASP.NET MVC4 Web应用程序所需要的基础知识. 本示例将构建什么样的应用程序? 您将实现一个简单的电影管理应用程 ...

  2. 《SteamVR2.2.0官方教程(二)》(Yanlz+Unity+XR+VR+AR+MR+SteamVR+Valve+Tutorials+Interaction+Oculus+立钻哥哥++ok++)

    <SteamVR2.2.0官方教程> <SteamVR2.2.0官方教程> 版本 作者 参与者 完成日期 备注 SteamVR2.2.0_Tutorials_V01_1.0 严 ...

  3. 《SteamVR2.2.0官方教程(一)》(Yanlz+Unity+XR+VR+AR+MR+SteamVR+Valve+Oculus+Tutorials+Interaction+立钻哥哥++ok++)

    <SteamVR2.2.0官方教程> <SteamVR2.2.0官方教程> 版本 作者 参与者 完成日期 备注 SteamVR2.2.0_Tutorials_V01_1.0 严 ...

  4. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  5. Asp.net MVC4.0(net4.5) 部署到window server 2003上的解决方案

    把Asp.net MVC4.0(net framework4.5) 部署到window server 2003上的解决方案 最近做了一个Web项目,也没多想就用了Asp.net MVC4.0 ,MVC ...

  6. Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序

    Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序(一) 原文 | 下载本教程中的编码例子 | 下载本教程的PDF版 (以后比较长的部 ...

  7. Asp.Net MVC4入门指南(3):添加一个视图

    在本节中,您需要修改HelloWorldController类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器HTML的过程. 您将创建一个视图模板文件,其中使用了ASP.NET MVC ...

  8. python入门教程 官方-Python 入门指南

    Python 入门指南¶ Release:3.6.3 Date:Dec 10, 2017 Python 是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面 ...

  9. [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十三:在DetailsView控件中使用TemplateField...

    导言 比起BoundField.CheckBoxField.HyperLinkField以及其他的那些数据字段控件(data field controls)来说,TemplateField提供了一种高 ...

  10. Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层

    原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研 ...

最新文章

  1. RoboGuice 解析
  2. 从此不再为Web页面中的Tooltip烦恼
  3. Google的AI模型是如何做A/B Test的
  4. Arduino IDE 如何添加 ESP32 开发板?
  5. 容器学习 之 管理Volumn(十七)
  6. sqoop从hive导入数据到mysql时出现主键冲突
  7. python最小值最大化和最大值最小化_OJ 21658::Monthly Expense(二分搜索+最小化最大值)...
  8. gTunnel:一个基于Golang的TCP隧道
  9. jeecg框架表格合计解决方案
  10. 随机过程中均值、方差、协方差和相关函数的计算
  11. 【大话传送网-学习笔记】传送网与GSM网络
  12. 当编程语言都变成女孩子
  13. 怎么去掉桌面“主文件夹”图标?
  14. 三层交换机设置成路由
  15. 详解| Sklearn—GridSearch 调参函数
  16. 我要吐槽各大自媒体平台的权重问题
  17. 邂逅你,是我最美的相遇
  18. PYthon-PIckle泡菜库
  19. 广告投放平台DSP搭建:你需要了解的产品核心模块
  20. 单片机_PWM输出原理详解

热门文章

  1. 学习移动机器人SLAM、路径规划必看的几本书
  2. 4本建模必读的书籍,每天学一点,获益匪浅
  3. java导出格式与拓展名不一致_ASP.NET导出Excel打开时提示:与文件扩展名指定文件不一致解决方法...
  4. 6款好用的在线思维导图工具推荐
  5. ota升级 rk3399_RK3399 的ota升级方法
  6. Linux:crond任务调度之at定时任务
  7. nanopi 2 fire s5p4418 初次体验 (1)uboot,linux kernel编译
  8. Android打字机动画,Android自定义View实现打字机效果
  9. c语言炉石传说测试数据库,炉石传说:王师傅微博分享算法入门题 网友:快把C语言播完吧!...
  10. 《孙子兵法》十三篇注译(5--形篇)