ASP.NET MVC 音乐商店 - 6. 使用 DataAnnotations 进行模型验证

在前面的创建专辑与编辑专辑的表单中存在一个问题:我们没有进行任何验证。字段的内容可以不输入,或者在价格的字段中输入一些字符,在执行程序的时候,这些错误会导致数据库保存过程中出现错误,我们将会看到来自数据库的错误信息。

通过为模型类增加数据描述的 DataAnnotations ,我们可以容易地为应用程序增加验证的功能。DataAnnotations  允许我们描述希望应用在模型属性上的验证规则,ASP.NET MVC 将会使用这些 DataAnnotations ,然后将适当的验证信息返回给用户。

为专辑表单增加验证

我们将会使用下列的 DataAnnotations

  • Required 必须 – 表示这个属性是必须提供内容的字段
  • DisplayName 显示名 – 定义表单字段的提示名称
  • StringLength 字符串长度 – 定义字符串类型的属性的最大长度
  • Range 范围 – 为数字类型的属性提供最大值和最小值
  • Bind 绑定 – 列出在将请求参数绑定到模型的时候,包含和不包含的字段
  • ScaffoldColumn 支架列 - 在编辑表单的时候,需要隐藏起来的的字符

注意:更多关于模型验证的信息,请参考:http://msdn.microsoft.com/zh-cn/library/ee256141%28VS.100%29.aspx

打开 Album 类,首先增加下面的 using 语句,这些语句引用了 DataAnnotations  使用的命名空间。

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

 

然后,更新属性,增加显示和验证的 DataAnnotations

复制代码
namespace MvcMusicStore.Models
{
[Bind(Exclude = "AlbumId")]
public class Album
{
[ScaffoldColumn(false)]
public int AlbumId { get; set; }
[DisplayName("Genre")]
public int GenreId { get; set; }
[DisplayName("Artist")]
public int ArtistId { get; set; }
[Required(ErrorMessage = "An Album Title is required")]
[StringLength(160)]
public string Title { get; set; }
[Required(ErrorMessage = "Price is required")]
[Range(0.01, 100.00,
ErrorMessage = "Price must be between 0.01 and 100.00")]
public decimal Price { get; set; }
[DisplayName("Album Art URL")]
[StringLength(1024)]
public string AlbumArtUrl { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
}
复制代码

 

然后,将专辑 Album 的属性 Genre 和 Artist 设置为虚拟的 virtual ,这将会使 EF-Code First 使用延迟加载。

public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }

 

为专缉修改完成之后,我们的创建和编辑界面立即就会验证字段,并且使用我们提供的显示名称,例如  AlbumArtUrl 将会成为 Album Art URL 等等。运行程序,浏览 /StoreManager/Create.

下一步,我们特意输入一些破坏验证规则的数据,在价格字段中输入 0, 将标题字段的内容保留为空白,当我们点击创建的时候,我们将会看到表单中不符合验证规则的字段显示了验证的错误提示信息。

测试客户端验证

对于应用程序来说,服务器端验证非常重要,因为用户可能绕过了客户端验证,实际上,Web 页面仅仅实现服务器端验证存在三个显著的问题:

  1. 在提交表单的时候,用户必须等待,验证在服务器端进行,需要将验证的结果发送回浏览器。
  2. 用户不能在输入错误的时候立即得到回应,以便通过验证规则的检查。
  3. 我们把可以在浏览器完成的工作交给了服务器,浪费了服务器的资源。 

幸运的是,ASP.NET MVC3 支架模板还提供了内建的客户端验证,不需要我们做额外的工作就可以使用。

在必须输入的标题字段中输入一个字符,验证的错误提示信息立即就消失了。

这里,我们要注意几点:

页面中已经引用了 jQuery 的脚本。

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

在 web.config 中,已经默认支持了客户端验证。

  <appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>

 

 

转载于:https://www.cnblogs.com/uppercloud/p/MVCMusicStore_7.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人生的12个经典领悟

1、父子二人经过五星级饭店门口&#xff0c;看到一辆十分豪华的进口轿车。儿子不屑地对他的父亲说&#xff1a;「坐这种车的人&#xff0c;肚子里一定没有学问&#xff01;」 父亲则轻描淡写地回答&#xff1a;「说这种话的人&#xff0c;口袋里一定没有钱&#xff01;」 2…

poll聊天室程序

poll聊天室程序 客户端: #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include &l…

EF Code First学习笔记:数据库创建(转)

控制数据库的位置 默认情况下&#xff0c;数据库是创建在localhost\SQLEXPRESS服务器上&#xff0c;并且默认的数据库名为命名空间context类名&#xff0c;例如我们前面的BreakAway.BreakAwayContext。 有几种方法可以改变这种默认约定。 利用配置文件 在配置文件中新加一个连接…

ASP.NET 2.0+Atlas编写鼠标拖放程序

作者&#xff1a;朱先忠编译摘要 本文将详细探讨Atlas中的声明性编程与强制性编程之间的关系&#xff0c;及如何用之在一个web客户端实现拖放功能。下图为本文相应示例程序运行结果快照。运行结果一. 简介  本文旨在帮助读者理 解微软的Atlas技术的某些方面的工作原理。Atlas…

疑难杂症--由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

在巡检数据库时发现&#xff0c;数据库备份作业失败&#xff0c;查看错误日志发现以下提示&#xff1a; 已以用户 WIN2008-JH122\SYSTEM 的身份执行。 Microsoft (R) SQL Server 执行包实用工具 Version 10.0.4000.0 for 64-bit 版权所有 (C) Microsoft Corp 1984-2005。保留…

call_once/once_flag的使用

call_once/once_flag的使用 保证在多线程环境中某个函数仅仅被调用一次,可以使用std::call_once函数,并且需要一个入参once_flag类型的入参 #include<iostream> #include <string> #include <tuple> #include <mutex> #include <thread> #incl…

算法基础系列之三:螺旋形矩阵

如何打印出如下这样的螺旋形的矩阵&#xff1a; 1 2 3 8 9 4 7 6 5 方法一&#xff1a; static void SpiralMatrix(int count) { int[,] iarray new int[count, count]; for (int i 0; i < count; i) { for (int j 0; j < count; j) { iarray[i, j] 0…

C++11异步操作

C11异步操作 C 11 提供了异步操作相关的类,主要有std::future std::promise std::package_task std::future作为异步结果的传输通道,获取线程函数的返回值; std::promise用来包装一个值,将数据和std::future绑定; std::package用来包装一个对象,将数据和future绑定起来,以方…

GDI对象的初始化

GDI对象的初始化 一、GR_GraphicsFactory对象的初始化在XAP_App对象的构造函数中创建GR_GraphicsFactory对象。在XAP_Win32App构造函数中&#xff0c;调用GR_GraphicsFactory对象的registerClass函数初始化m_vAllocators、m_vDescriptors、m_vClassIds集合成员变量&#xff0c;…

存储过程从入门到熟练(多个存储过程完整实例及调用方法)_AX

①为什么要使用存储过程?因为它比SQL语句执行快.②存储过程是什么?把一堆SQL语句罗在一起,还可以根据条件执行不通SQL语句.(AX写作本文时观点)③来一个最简单的存储过程CREATE PROCEDURE dbo.testProcedure_AXASselect userID from USERS order by userid desc注:dbo.testPro…

Abiword中字符操作

Abiword中字符操作 一、关于不同字符的宏定义 typedef gunichar UT_UCS4Char;typedef guint16 UT_UCS2Char;typedef UT_UCS4Char UT_UCSChar; /* Unicode */ typedef guint32 gunichar;typedef guint16 gunichar2; AbiWord is now fully converted to using 32-bi…

C++ 11线程池 ThreadPool

线程池 ThreadPool 半同步半异步线程池(简略版)C11实现,详细解析 同步队列 SynchronousQueue.hpp #include <list> #include <mutex> #include <thread> #include <condition_variable> #include <iostream> using namespace std;template&l…

ITPro Magazine2006年第6期发布

下载地址[url]http://www.cnfan.net/magazine/itpromagazine200606.rar[/url]主题企划Windows Fundamentals For Legacy PCs深度解析&#xff1a;Windows Vista RC1的五大特性系统应用Win2003平台php环境架设Xen3安装及使用(On Fedora core5)ISA Server 2004 ***应用网络与安全…

abiword class list

Class List【转自官方文档】 Here are the classes, structs, unions and interfaces with brief descriptions:GR_CharWidths::_a _AbiCellRendererFont _AbiCellRendererFontClass _AbiControlGUI _AbiFontCombo _AbiFontComboClass _AbiPrivData _AbiTable _AbiWidget _AbiW…

网络资源的初始化与释放(C++ RAII惯用法)

1. 网络资源的初始化与释放(C RAII惯用法) C RAII 惯用法 RAII (Resource Acquisition Is Initialization)资源获取即初始化 我们拿到资源的时候就已经初始化,一旦不需要该资源,该资源就会被释放 资源: 在 C 的语境下&#xff0c;资源代表一些可以必须先被获取才能使用的对…