如果你查看页面源代码,会发现Major输入框的input标签上有相应的自定义属性data-val-length-max=200和data-val-length,而这些属性值正是来自于模型的数据注解。
控制器的服务器端验证
在启用JavaScript的情况下,由于所有的错误输入在客户端就会被拦截,所以根本到达不了服务器,不过这并不表示恶意用户无法提交错误的输入,有很多种方法可以做到:
禁用JavaScript
不同浏览器禁用JavaScript的方法不同,在Chrome中,F12打开开发工具,然后找到设置对话框:
此时提交页面,你会看到和前面完全相同的页面,由于本地运行速度很快,你甚至可能没意识已经发起了一次HTTP POST请求,而显示错误提示的页面来自服务器,而不是客户端:
响应正文包含如下内容,其中错误信息是服务器端生成的:
NameName 字段是必需的。
此时再回过头来看下Students控制器中Create操作方法的定义:
[HttpPost] [ValidateAntiForgeryToken] )] Student student) { if (ModelState.IsValid) { db.Students.Add(student); db.SaveChanges(); ); } return View(student); }
如果验证失败,则不更新数据库,并返回带Student模型的视图。
模拟POST请求
有很多工具可以模拟POST,这里我们讲解如果使用Fiddler来模拟项服务器提交POST请求。
打开Fiddler,就开始自动监测所有的HTTP请求,这时我们刷新Create页面,并在JavaScript禁用的情况下,提交表单,这时会有两个请求:
首先选中左侧的第二个请求,右侧面板中选择Inspectors->WebForms,下面会显示三个窗格:
1. QueryString:当前请求的URL查询字符串。
2. Body:POST请求的表单参数。
3. 第三部分:响应正文,我们可以看到服务器端返回的错误信息。
现在切换到Composer选项卡,我们可以在这里面模拟POST请求:
上面有一段提示信息:使用这个页面创建一个请求。你可以通过拖拽的方式从左侧会话列表中拷贝一个之前的请求。
这就方便多了,我们从左侧选中第二个请求并拖拽到本页面:
这时页面背景变成明显的绿色以作提示,拖拽结束: