模型的绑定与验证
通过模型绑定获取表单数据
模型绑定
将浏览器发送的HTTP请求数据转换为.NET对象的过程
模型绑定使我们在控制器中可以直接获取视图,或URL传递过来的数据,并且这些数据可以自动转换为模型对象,以便调用
-
获取绑定的值:
(1)Request.Form:获取表单提交的值;
(2)RouteData.Values:获取路由的值;
(3)Request.QueryString:获取URL的值;
(4)Request.Files:获取上传文件。 -
修改后的控制器包含两个版本的Index操作方法,无参数的Index方法支持浏览(HTTP GET),带参数的Index方法支持提交(HTTP POST),所以加上[HttpPost]标注。
-
默认的模型绑定需要遵守相关约定。在视图中,表单标签的name属性和模型对象属性的名称必须相同,否则无法完成绑定
通过绑定基本类型获取表单数据
public class HomeController : Controller
{
[HttpPost]
public ActionResult index(string gname, int? gid)
{
ViewBag.Info = "您输入的商品编号是:" +gid + ",名称是:" + gname;
return View();
}
}
在Index(string gname, int? gid)
方法的参数声明中,gid参数需要设定为int?类型,这种类型称为“可空 int类型”,表示即可以是int类型,也可以是null类型。
对模型数据进行验证
- 数据注解
- ASP.NET MVC 框架提供了数据验证的 API,称为 “模型数据注解” 或 “模型元数据”
- 数据验证API位于
System.ComponentModel.DataAnnotations
名称空间
数据验证API | 示例 | 说明 |
---|---|---|
Compare | [Compare(“MyOtherProperty”)] | 两个属性值必须相同 |
Range | [Range(10, 20)] | 属性值必须在指定的数值范围内 |
RegularExpression | [RegularExpression(“pattern”)] | 属性值必须匹配正则表达式 |
Required | [Required] | 属性值必须非空或者不能只是空格 |
StringLength | [StringLength(10)] | 属性值长度不能超过给定的最大长度 |
模型验证(下例)
public class Movie
{
// 影片名称
[Required] // 不允许属性值为空
public string Title { get; set; }
// 上映日期
[DataType(DataType.Date)] // 指定属性值为日期格式
public DateTime ReleaseDate { get; set; }
// 光盘售价
[Range(1, 100)] // 属性值在1~100范围
[DataType(DataType.Currency)] // 指定属性值为货币
public decimal Price { get; set; }
// 评分
[StringLength(10)] // 属性值的最大长度为10
public string Rating { get; set; }
}
通过EF框架实现删除和修改
通过EF框架删除数据
// 示例代码
using (DBTESTEntities db = new DBTESTEntities())
{
var del = db.TableName.Find(ID);
// 根据ID删除表中数据
db.TableName.Remove(del);
// 提交更新
db.SaveChanges();
}
通过EF框架修改数据
// 示例代码
using (DBTESTEntities db = new DBTESTEntities())
{
var Update = db.TableName.Find(ID);
// 根据ID修改表中数据
Update.LineName = 8000;
// 提交更新
db.SaveChanges();
}
实现登录及MVC Filter的应用
- Filter(过滤器)
- 通常控制器的操作方法在执行前后,需要处理运行过程中所产生的状况,为了满足此要求,ASP.NET MVC提供过滤器来处理
- 支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和 Exception(异常)
Filter Type | 实现接口 | 执行时间 | Default Implementation |
---|---|---|---|
Authorize Filter | AuthorizeFilter | 在所有Filter和Action执行之前执行 | AuthorizeAttribute |
Action Filter | ActionFilter | 分别在Action执行之前和之后执行 | ActionFilterAttribute |
Result Filter | ResultFilter | 分别在Action Result 执行之后和之前执行 | ResultFilterAttribute |
Exception Filter | ExceptionFilter | 只有在filter或者action method或者action result抛出一个异常时侯执行 | HandleErrorAttribute |
AuthorizeFilter筛选器
- AuthorizeFilter
- 授权过滤器是最先运行的过滤器,可以用于对操作方法在正式运行前做一些额外的判断,例如,登录验证,授权检查、是否为SSL完全链接、验证输入信息是否包含攻击字符串等。
ActionFilter过滤器
- ActionFilter
- ActionFilter与AuthorizeFilter类似,只是执行时间不同。
- ActionFilter过滤器是在Action方法执行前后会触发,主要用于在Action执行前后处理一些相应的逻辑。
ResultFilter过滤器
- ResultFilter
- ResultFilter过滤器的使用和ActionFilter, AuthorizeFilter过滤器使用方式类似,只是执行时间不同。
- ResultFilter分别在Action Result执行之前和之后分别执行,即在展示结果之前和之后分别执行。
ExceptionFilter过滤器
- ExceptionFilter
- 只有在filter,或者 action method, 或者 action result 抛出一个异常时候执行。
布局页和分部视图
母版视图的基本使用( @RenderBody )
-
母版页
- 在ASP.NET MVC应用程序中,依然沿用了母版页技术
- 在ASP.NET MVC,可以使用 “布局页”、“页面片段”、“分部视图”等视图技术,组织站点视图页面的版面结构,实现应用程序一致的外观与界面
-
_ViewStart.cshtml
- 该文件默认位置:/Views/_ViewStart.cshtml
- _ViewStart.cshtml的特点是“预加载”
-
_Layout.cshtml
- 该文件默认位置:/Views/Shared/_Layout.cshtml
- _Layout.cshtml通常称为“布局页”、“母版视图”、“模板页”
-
_Layout.cshtml有两段特别的Razor声明
- RenderBody:“body占位符”的作用。子视图页面的所有内容默认填入到_Layout.cshtml的@RenderBody所在位置
- RenderSection:作用是“块占位符”。将子页面中定义的代码块填入到_Layout.cshtml的@ RenderSection所在位置
注意
1.@RenderBody呈现的页面内容只能显示在标签对之间。该方法不需要参数,而且只能在视图页面中出现一次。
2.修改_Layout.cshtml的名称或删除该文件后,会发生异常:“未能在以下路径中找到布局页“。此时需要在视图代码的第一行输入新的模板页面地址,以代替默认的_Layout.cshtml
母版中的页面片段(@RenderSection)
- RenderSection
- RenderBody在_Layout.cshtml中只能使用一次
- 有更多的子视图内容填入到_Layout.cshtml,需使用RenderSection,即“页面片段”技术
注意
如果新建的子视图没有定义“页面片段”,则会抛出异常。可以使用 @RenderSection(“foot”, false) 引用“页面片段”,参数false代表“foot页面片段”不是必须的,子视图页面不用强制定义
分部视图
-
分部视图
- 用户控件技术在ASP.NET MVC称为分部视图
- 创建分部视图,分为以下三个步骤:
- 右键点击/Views/Shared目录,选择“添加”-“视图”;
- 设定“视图名称”为“_top”,并选中“创建为分部视图”;
- 在新建的_top.cshtml中输入页面内容。
-
引入分布视图,有如下几种方式:
- @Html. Partial()与@Html.RenderPartial()
- @Html.Action()与@Html.RenderAction()
-
分部视图
- @Html. Partial()与@Html.RenderPartial()直接将分部视图嵌入到界面上,不需要单独的Controller中的方法,分部视图可以共享主视图中控制器返回的数据。
- @Html.Action()与@Html.RenderAction()则通过分部视图单独的Controller中的方法来将分部视图嵌入到页面上。
- @Html. Partial()与@Html.Action()返回字符串。
- @Html.RenderPartial()与@Html.RenderAction()直接输出至当前HttpContext。
注意
分部视图文件放置于 /Views/Shared目录下,任何视图都可以通过@Html.Partial方法载入使用
在MVC中使用AJAX
AJAX辅助方法
-
Ajax辅助方法
- 同样可以用于创建表单和指向控制器操作方法的链接,但不同的是,它们与服务器采用的是Ajax(异步交互)方式
- 当使用Ajax辅助方法时,无须编写任何脚本代码即可实现程序的异步性。
-
脚本
- 使用Ajax辅助方法必须先引入jQuery.unobtrusive-ajax.js
- 此文件默认包含在ASP.NET MVC应用程序模板中。
-
nAjax辅助方法通过“@Ajax”调用
- 如“@Ajax.ActionLink”、“@Ajax.BeginForm”
-
Ajax.ActionLink方法
- 可以创建一个具有异步行为的超链接。
- ActionLink方法的第一个参数是超链接的文本,第二个参数是操作方法的名称。
- ActionLink方法可以通过设置AjaxOptions对象的属性值来调整Ajax请求的行为
AjaxOptions对象能够配置对服务器的异步请求以及处理返回的数据
属性 | 作用 |
---|---|
Confirm | 获取或设置提交请求之前,显示于确认窗口中的消息。 |
HttpMethod | 获取或设置 HTTP 请求方法(“GET”或“POST”)。 |
InsertionMode | 获取或设置指定如何将响应结果插入到目标 DOM 元素的模式。 |
LoadingElementId | 获取或设置加载时要显示的 HTML 元素的 id 属性值。 |
OnBegin | 获取或设置更新页面之前调用的 JavaScript 函数的名称。 |
OnComplete | 获取或设置数据响应之后,更新页面之前,调用的 JavaScript 函数。 |
OnFailure | 获取或设置页面更新失败时调用的 JavaScript 函数。 |
OnSuccess | 获取或设置页面更新成功之后调用的 JavaScript 函数。 |
UpdateTargetId | 获取或设置要使用服务器响应来更新的 DOM 元素的 ID。 |
Url | 获取或设置要向其发送请求的 URL。 |
Ajax.BeginForm
- 使用的Ajax.BeginForm方法创建的是异步表单
MVC中应用 jQuery Ajax
- 当使用Visual Studio创建ASP.NET MVC应用程序时,会默认生成Scripts目录,其中包含了jQuery需要的所有库文件
- jQuery核心库是名为jQuery-1.7.1.js的文件
- 两个jQuery插件:jQuery UI和jQuery Validate(验证)
- 包含“unobtrusive”字样的文件是由Microsoft编写的非侵入式脚本文件