在进行ASP.NET MVC开发时,遇到了以下知识点,现摘记如下。
ASP.NET MVC 是微软官方提供的以MVC模式为基础的ASP.NET Web应用程序(Web Application)框架,它由Castle的MonoRail而来,目前最新版本是ASP.NET MVC 5.1。
-
Model(模型)表示应用程序核心(比如数据库记录列表)。
-
View(视图)显示数据(数据库记录)。
-
Controller(控制器)处理输入(写入数据库记录)。
通常模型对象负责在数据库中存取数据。
通常视图是依据模型数据创建的。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
1.System.ComponentModel命名空间。
提供用于实现组件和控件运行时和设计时行为的类。此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口。
该命名空间中的类分为以下类别:
-
核心组件类。请参见 Component、IComponent、Container 和 IContainer 类。
-
组件授权。请参见 License、LicenseManager、LicenseProvider 和 LicenseProviderAttribute 类。
-
属性。请参见 Attribute 类。
-
说明符和持久性。请参见 TypeDescriptor、EventDescriptor 和PropertyDescriptor 类。
-
类型转换器。请参见 TypeConverter 类。
2.System.ComponentModel.DataAnnotations命名空间。
提供用于为实体类定义元数据的特性类。
3. 注解[Key] 用于标示主键。
4.注解[Description] 表示可视化设计器在引用组件成员时可以显示指定的说明。
数据验证相关的数据注解:
[Remote] | 使用 jQuery 验证插件远程验证程序的特性 |
[FileExtension] | 验证文件扩展名 |
[Compare] | 比较两个属性的值 |
[RegularExpression] | 使用正则表达式验证 |
[CustomValidation] | 自定义验证方法 |
[DataType] | 指定要与数据字段关联的附加类型的名称 |
[EmailAddress] | 电子邮件地址(相当于[DataType(DataType.Email)]) |
[Phone] | 电话(同上) |
[CreditCard] | 信用卡号码(同上) |
[Url] | 验证URL(同上) |
[MemberShipPassword] | 验证密码字段是否满足成员资格提供程序的当前密码要求 |
数据映射相关的数据注解:
[Key] | 主键字段 |
[Column] | 数据库列属性映射 |
[NotMapped] | 不要创建对应的字段 |
[Table] | 指定类将映射到的数据库表 |
[ForeignKey] | 表示关系中用作外键的属性 |
[DatabaseGenerated] | 指定数据库生成属性值的方式(EF不追踪属性的变化) |
数据显示相关的数据注解:
[DisplayName] | 指定本地化的字符串(习惯用语类) |
[Display] | 指定本地化的字符串(习惯用语属性) |
[DisplayFormat] | 设置数据字段的格式 |
[ReadOnly] | 指定该特性所绑定到的属性是只读属性还是读/写属性 |
[EditAble] | 指示数据字段是否可编辑 |
[HiddenInput] | 指示是否应将属性值或字段值呈现为隐藏的 input 元素 |
[ScaffoldColumn] | 指定类或数据列是否使用基架 |
[UIHint] | 指定动态数据用来显示数据字段的模板 |
[HttpPost] 标识是在Controller中的相应方法上注释表单提交方式为 post
其他
[DisplayColumn] | 将所引用的表中显示的列指定为外键列 |
[Description] | 可视化设计器在引用组件成员时可以显示指定的说明 (命名空间:System.ComponentModel.DescriptionAttribute) |
5.C#语法中一个个问号(?)的运算符是指:可以为 null 的类型。
6.The System.ComponentModel.DataAnnotations.Schema namespace provides support for attribute classes that are used to define metadata for ASP.NET MVC and ASP.NET data controls.
7.ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型,它会在程序运行的时候动态解析。所以在视图中获取它的数据时候不需要进行类型转换.
ViewBag是一个很神奇的东西,它是一个动态对象。简单点说就是你可以给它添加任何属性,这个属性可以是任何类型。
ViewBag的主要用途就是在Controller里给ViewBag添加属性值,并在View中读取这些值并显示出来。
ViewData | ViewBag |
它是Key/Value字典集合 | 它是dynamic类型对像 |
从Asp.net MVC 1 就有了 | ASP.NET MVC3 才有 |
基于Asp.net 3.5 framework | 基于Asp.net 4.0与.net framework |
ViewData比ViewBag快 | ViewBag比ViewData慢 |
在ViewPage中查询数据时需要转换合适的类型 | 在ViewPage中查询数据时不需要类型转换 |
有一些类型转换代码 | 可读性更好 |
8.Membership.ValidateUser 方法 (String, String)验证提供的用户名和密码是有效的。命名空间: System.Web.Security
9.FormsAuthentication.SetAuthCookie 方法(String, Boolean)为提供的用户名创建一个身份验证票证,并将该票证添加到响应的 Cookie 集合中或 URL 中(如果使用的是无 Cookie 身份验证)。命名空间: System.Web.Security
publicstaticvoid SetAuthCookie(
string userName,
bool createPersistentCookie
)
//设置用户的 cookie 的值 FormsAuthentication.SetAuthCookie(loginName,false);
//获取用户的 cookieHttpCookie cookie= FormsAuthentication.GetAuthCookie(loginName,false);
//FormsAuthentication .SignOut只是注销掉此用户的登录信息,而且这个时间是在Application的Authentication事件后执行,当你再次操作时,因为用户的登录信息已经注销掉,通不过Form验证才会跳转到登录页面。
10.在ASP.NET MVC中,要从一个Action跳转到另一个Action,通常是用一系列以“Redirect”开头的方法Redirect/RedirectToAction/RedirectToRoute之类的。
但是使用Redirect系列的方法进行跳转时,默认是使用GET方法的,也就是说,如果你的跳转请求带有参数,那么这些参数将全部暴露在跳转后的url中,增加了不安全性(特别是如果参数中包含密码、密钥等等敏感数据)
于是就想到了用POST方法传递数据,这样至少一般的访问者无法从url中获取敏感信息。但是仔细查阅了MSDN和StackOverflow,得到的答案是“Redirect方法不支持POST”。
好在StackOverflow上找到一个回答 点我 ,倒是给我一些启发。直接POST不行,那就间接POST,先通过一个GET方法获取某个页面,然后以这个页面为中介将数据POST给真正要处理请求的页面。
11.ModelState.AddModelError("userPwd", "请输入密码!"); ModelState是一个字典类型,这句话的作用是向ModelState中添加一条错误信息,第一个参数是Key,第二个参数是Value。
@using (Html.BeginForm( new {} )) {} // 提交到当前页面,并可以传递参数
@using (Html.BeginForm( " action ", " controller ")) {} // 提交到指定controller下的action中
@using (Html.BeginForm( " action ", " controller ",FormMethod.POST)) {} // 提交到指定controller下的action中,并指定提交方式
1.input注明要验证是属于前台的,当某各原因导致前台无法进行验证,比如js没有成功加载的,
当后台if (ModelState.IsValid)失败后,错误信息就会显示到 @Html.ValidationSummary()
2.当前后台验证都通过,但某些逻辑验证没有通过,比如用记名密码错误的,可以手工添加错误信息,
ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");这个也会显示到@Html.ValidationSummary()
18.Razor通过在代码块中使用“@:字符序列”来显式指明内容块的开始。@:序列表明该行后面的内容应该被视为内容块。
19.FormCollection用来在controller中获取页面表单元素的数据。它是表单元素的集合,包括<input type="submit" />元素。
Represents a collection of Form objects.
Namespace: System.Windows.Forms
20.编辑程序时,只有生成了解决方案,才能选择视图创建时等的模型类。
21.在Html辅助方法中若要输出减号,必须用"_",即下划线代替.
22.并不是加上DataType属性的ErrorMessage参数,就一定会在View页面中显示错误信息,因为VS的版本限制问题,有些不支持页面的JAVASCRIPT.此时,可以利用TextBoxFor辅助方法,并指定一个data-val-email属性即可.如@Html.TextBoxFor(model=>model.email,new{data_val_email="请输入Email地址"})
同时,也可以通过更改script代码或者Jquery的有效验证信息来操作.
23.location.reload();
reload()方法用于刷新当前文档。
reload() 方法类似于你浏览器上的刷新页面按钮。
如果把该方法的参数设置为 true,那么无论文档的最后修改日期是什么,它都会绕过缓存,从服务器上重新下载该文档。这与用户在单击浏览器的刷新按钮时按住 Shift 健的效果是完全一样。
24.ASP MVC中NT$@(Model[i].Product.Price)什么意思, 貌似NT表示后面的符号直接输出.
25.由于案例中Product&ProductCategory之间是多对一的关系,因此,可以在该数据模型中添加导览属性(navigation Property),
ProductCategory中为: public virtual ICollection<Product> Products(get;set;);
Product中为: public virtual ProductCategory ProductCategory(get;set;);
其中virtual关键字表示延迟装入功能.
26.应用程序启动时自动升级数据库(通过应用所有挂起的迁移)。可通过注册 MigrateDatabaseToLatestVersion 数据库初始值设定项来实现这一点。数据库初始值设定项只是包含用于确保数据库安装正确的某种逻辑。首次在应用程序进程 (AppDomain) 中使用上下文时,将运行此逻辑。
即在文件Global.asax 中的Application_Start方法上加上System.Data.Entity.Database.SetInitializer()方法,并添加System.Data.Entity.MigrateDatabaseToLatestVersion<BlogContext, Configuration>()参数,而参数System.Data.Entity.DropCreatDatabaseIfModelChanges是重新建立,不利于保存原始数据.
即最终的代码为:System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<Model.MvcShoppingContext, Migrations.Configuration>() );
27.MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来, 经md2、md3和md4发展而来。引用using System.Security.Cryptography;
C# md5加密:
string a; //加密前数据
string b; //加密后数据
b=System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(a,"MD5")
28.UriBuilder 类, 提供用于统一资源标识符 (Uri) 自定义的构造函数,并修改 UriUri 类。命名空间: System
UriBuilder 类提供了一种方便的方式来修改的内容 Uri 而无需创建一个新的实例 Uri 为每次修改的实例。
UriBuilder 属性可用来为只读的读/写访问Uri 属性,以便可以修改它们。
名称 | 说明 | |
---|---|---|
![]() | UriBuilder() |
初始化 UriBuilder 类的新实例。 |
![]() | UriBuilder(String) |
用指定的 URI 初始化 UriBuilder 类的新实例。 |
![]() | UriBuilder(String, String) |
新实例初始化 UriBuilder 与指定的方案和宿主的类。 |
![]() | UriBuilder(String, String, Int32) |
新实例初始化 UriBuilder 类,具有指定的方案、 主机和端口。 |
![]() | UriBuilder(String, String, Int32, String) |
新实例初始化 UriBuilder 类,具有指定的方案、 主机、 端口号和路径。 |
![]() | UriBuilder(String, String, Int32, String, String) |
新实例初始化 UriBuilder 类使用指定的方案、 主机、 端口号、 路径和查询字符串或段标识符。 |
![]() | UriBuilder(Uri) |
使用指定的 UriBuilder 实例初始化Uri 类的新实例。 |
名称 | 说明 | |
---|---|---|
![]() | Fragment |
获取或设置 URI 的片段部分。 |
![]() | Host |
获取或设置的域名系统 (DNS) 主机名或服务器的 IP 地址。 |
![]() | Password |
获取或设置与用户访问 URI 相关联的密码。 |
![]() | Path |
获取或设置由 URI 引用的资源的路径。 |
![]() | Port |
获取或设置 URI 的端口号。 |
![]() | Query |
获取或设置在 URI 中包括的任何查询信息。 |
![]() | Scheme |
获取或设置 URI 的方案名称。 |
![]() | Uri |
获取 Uri 构造由指定的实例 UriBuilder 实例。 |
![]() | UserName |
与用户访问 URI 相关联的用户名。 |
29.SmtpClient 类 允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件。命名空间: System.Net.Mail
构造函数如下:
名称 | 说明 | |
---|---|---|
![]() | SmtpClient() |
新实例初始化 SmtpClient 类通过使用配置文件设置。 |
![]() | SmtpClient(String) |
新实例初始化 SmtpClient 通过使用指定的 SMTP 服务器发送电子邮件的类。 |
![]() | SmtpClient(String, Int32) |
新实例初始化 SmtpClient 通过使用指定的 SMTP 服务器和端口来发送电子邮件的类。 |
属性如下:
名称 | 说明 | |
---|---|---|
![]() | ClientCertificates |
指定应使用哪个证书来建立安全套接字层 (SSL) 连接。 |
![]() | Credentials |
获取或设置用来对发件人进行身份验证的凭据。 |
![]() | DeliveryFormat |
获取或设置所使用的传递格式 SmtpClient 发送电子邮件。 |
![]() | DeliveryMethod |
指定如何发送的电子邮件将处理消息。 |
![]() | EnableSsl |
指定是否 SmtpClient 使用安全套接字层 (SSL) 加密的连接。 |
![]() | Host |
获取或设置一个或多个 SMTP 交易记录所用的主机的 IP 地址。 |
![]() | PickupDirectoryLocation |
获取或设置应用程序在其中保存邮件以处理由本地 SMTP 服务器的文件夹。 |
![]() | Port |
获取或设置用于 SMTP 事务的端口。 |
![]() | ServicePoint |
获取用于传输电子邮件的网络连接。 |
![]() | TargetName |
获取或设置服务提供程序名称 (SPN) 时使用扩展的保护用于进行身份验证。 |
![]() | Timeout |
获取或设置一个值,指定的后的时间量同步 Send 调用会超时。 |
![]() | UseDefaultCredentials |
获取或设置 Boolean 值,该值控制是否 DefaultCredentials 随请求一起发送。 |
方法:
名称 | 说明 | |
---|---|---|
![]() | Dispose() |
将一条 QUIT 消息发送到 SMTP 服务器、 正常结束 TCP 连接,并释放所有资源的当前实例所使用的SmtpClient 类。 |
![]() | Dispose(Boolean) |
将一条 QUIT 消息发送到 SMTP 服务器、 正常结束 TCP 连接时,释放使用的当前实例的所有资源SmtpClient 类,并可根据需要释放托管资源。 |
![]() | Equals(Object) |
确定指定的对象是否等于当前对象。(继承自 Object。) |
![]() | Finalize() |
在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。(继承自Object。) |
![]() | GetHashCode() |
作为默认哈希函数。(继承自 Object。) |
![]() | GetType() | |
![]() | MemberwiseClone() | |
![]() | OnSendCompleted(AsyncCompletedEventArgs) |
引发 SendCompleted 事件。 |
![]() | Send(MailMessage) |
将指定的消息发送到 SMTP 服务器以进行传递。 |
![]() | Send(String, String, String, String) |
将指定的电子邮件发送到 SMTP 服务器以进行传递。 邮件发件人、 收件人、 主题和消息正文使用指定String 对象。 |
![]() | SendAsync(MailMessage, Object) |
将指定的电子邮件发送到 SMTP 服务器以进行传递。 此方法不会阻止调用线程,并允许调用方将对象传递给该操作完成时调用的方法。 |
![]() | SendAsync(String, String, String, String, Object) |
将一封电子邮件发送到 SMTP 服务器以进行传递。 邮件发件人、 收件人、 主题和消息正文使用指定String 对象。 此方法不会阻止调用线程,并允许调用方将对象传递给该操作完成时调用的方法。 |
![]() | SendAsyncCancel() |
取消异步操作以发送电子邮件。 |
![]() | SendMailAsync(MailMessage) |
将指定的消息发送到 SMTP 服务器以进行异步操作的形式传递。 |
![]() | SendMailAsync(String, String, String, String) |
将指定的消息发送到 SMTP 服务器以便以异步操作的形式交付。 。 邮件发件人、 收件人、 主题和消息正文使用指定String 对象。 |
![]() | ToString() |
返回表示当前对象的字符串。(继承自 Object。) |
30.MailMessage 类 表示可以使用 SmtpClient 类发送的电子邮件。 命名空间: System.Net.Mail
构造函数:
名称 | 说明 | |
---|---|---|
![]() | MailMessage() |
初始化 MailMessage 类的空实例。 |
![]() | MailMessage(MailAddress, MailAddress) |
使用指定的 MailAddress 类对象初始化 MailMessage 类的新实例。 |
![]() | MailMessage(String, String) |
使用指定的 String 类对象初始化 MailMessage 类的新实例。 |
![]() | MailMessage(String, String, String, String) |
初始化 MailMessage 类的新实例。 |
属性:
名称 | 说明 | |
---|---|---|
![]() | AlternateViews |
获取用于存储邮件正文的替代形式的附件集合。 |
![]() | Attachments |
获取用于存储附加到此电子邮件的数据的附件集合。 |
![]() | Bcc |
获取包含此电子邮件的密件抄送 (BCC) 收件人的地址集合。 |
![]() | Body |
获取或设置邮件正文。 |
![]() | BodyEncoding |
获取或设置用于邮件正文的编码。 |
![]() | BodyTransferEncoding |
获取或设置用于消息正文的传输编码。 |
![]() | CC |
获取包含此电子邮件的抄送 (CC) 收件人的地址集合。 |
![]() | DeliveryNotificationOptions |
获取或设置此电子邮件的发送通知。 |
![]() | From |
获取或设置此电子邮件的发信人地址。 |
![]() | Headers |
获取与此电子邮件一起传输的电子邮件标头。 |
![]() | HeadersEncoding |
获取或设置此电子邮件的用户定义的自定义标题使用的编码。 |
![]() | IsBodyHtml |
获取或设置指示邮件正文是否为 Html 格式的值。 |
![]() | Priority |
获取或设置此电子邮件的优先级。 |
![]() | ReplyTo |
已过时。 获取或设置邮件的回复地址。 |
![]() | ReplyToList |
获取或设置邮件的回复地址的列表。 |
![]() | Sender |
获取或设置此电子邮件的发件人地址。 |
![]() | Subject |
获取或设置此电子邮件的主题行。 |
![]() | SubjectEncoding |
获取或设置此电子邮件的主题内容使用的编码。 |
![]() | To |
获取包含此电子邮件的收件人的地址集合。(既然是集合,就拥有集合的相关操作方法,如ADD等) |
方法:
名称 | 说明 | |
---|---|---|
![]() | Dispose() |
释放由 MailMessage 使用的所有资源。 |
![]() | Dispose(Boolean) |
释放由 MailMessage 占用的非托管资源,还可以另外再释放托管资源。 |
![]() | Equals(Object) |
确定指定的对象是否等于当前对象。(从 Object 继承。) |
![]() | Finalize() |
在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。(从 Object 继承。) |
![]() | GetHashCode() |
作为默认哈希函数。(从 Object 继承。) |
![]() | GetType() | |
![]() | MemberwiseClone() | |
![]() | ToString() |
返回表示当前对象的字符串。(从 Object 继承。) |
31.#if与#endif指示词可以设置特定程序代码区段是否要出现在特定方案配置下.
32.PagedList<T> 类 表示分页的列表,其中包含项和一个继续标记的列表。命名空间: System.Fabric.Query, 也可以通过NUGET管理器添加.
MVC中操作分页可以通过以下三个过程进行.
32.1 取得IEnumerable或IQueryable型别的源数据,或继承这两个型别的子类别.
32.2 通过ToPagedList扩充方法,取得分页后的结果信息,并将信息传入View里.
32.3 在View页面中通过@Html.PagedListPager辅助方法输出分页所需的分页导览链接.