ASP.NET MVC3学习笔记(一)
一、Html.RenderPartial方法和Html.RenderAction方法 :
1、共同点
Html.RenderPartial与Html.RenderAction两个方法都是在ASP.NET MVC中用来显示PartialView的方法,都用来在HTML页面上嵌入用户自定义控件,都常被用来显示一个功能相对独立的模块让网页相同功能的模块可以重复使用,比如显示菜单和导航条,两者输出的结果都被作为调用View的一部分显示。
2.区别:
(1)Html.RenderPartial方法是直接Html页面上嵌入用户自定义控件。
语法为:
在“ASPX”视图引擎里面的语法<%Html.RenderPartial("UserControlName","YourData");%>
在Razor视图引擎里面的语法:@{ Html.RenderAction("UserControlName","YourData"}
YourData是一个可选参数。如果有,则YourData会赋给PartialView中的Model;如果没有,则调用Html.RenderPartial方法的View的Model会赋给PartialView中的Model即PartialView的数据来自于调用的View。
或者
<%Html.RenderPartial("~/Areas/Comm/Views/Shared/UserControlName.ascx");%>
注意:第一种方法中用户控件必须放在调用者同一目录下,也可以放在View/Shared中。
(2)Html.RenderAction方法是通过Controller(用户控件所在的Controller)里面的Action方法来调用用户自定义控件。允许直接调用一个Action方法,并把返回结果直接显示在当前的View中
语法为:
在“ASPX”视图引擎里面的语法:<%Html.RenderAction("UserControlName","Controller");%>
在Razor视图引擎里面的语法:@{ Html.RenderAction("UserControlName","Controller"}
Html.RenderAciton方法还提供了另外一种强行调用Action的方式,如下:
例子:<%Html.RenderAction<I3.Controllers.ProductController>(x => x.ProductList()); %>执行ProductController的方法ProductList()
3.小结:
(1)可知Html.RenderPartial方法的数据来自调用它的View而Html.RenderAction方法的数据来自于它自己。
(2)Html.RenderAction方法会发起一个新的Request,而Html.RenderPartial方法则不会。
(3)Html.RenderPartial方法适用于呈现需要重复使用的UserControl,而且只需要通过Model来呈现内容。
(4)Html.RenderAction方法适用于需要从数据库获取数据的(即通过Action方法来读取数据库数据)的UserControl。
二、ASP.NET MVC 中的ViewData与ViewBag
Asp.net MVC默认使用 Web Form来作为View,新建的aspx页面均是继承于ViewPage。而ViewData和ViewBag都是ViewPage的属性。ViewPage.ViewData表示获取或设置一个字典,其中包含在控制器和视图时间传递的数据,也就是说ViewPage.ViewData是控制器Controller和视图View之间沟通传递数据的桥梁。而ViewPage.ViewBag则表示获取一个视图包。
1、ViewData和ViewBag的差别:
类型和作用 |
引入时间 |
版本 |
查询速度 |
是否需要类型转换 |
可读性 |
|
ViewData |
字典类型(Key和Value的合)是 |
ASP.NETMVC 1.0引入 |
基于.Net Framework 3.5 |
ViewData查询速度比ViewBag快 |
在ViewPage中查询数据时需要进行类型转换 |
可读性相对要差点 |
ViewBag |
dynamic类型 |
ASP.NET MVC 3.0引入 |
基于.Net Framework 4.0 |
查询速度比ViewData慢 |
在ViewPage中查询数据时不需要进行类型转换 |
可读性更好 |
三、获取ASP.NET MVC的请求数据的方法
请求数据包括:窗体数据、查询字符串参数值、cookie
要获取ASP.NET MVC的请求数据就需通过Request属性。控制器Controller和视图View都有一个Requerst属性,它们都可以用来获取请求数据。
1、获取指定窗体的请求数据
通过Request.Form就可以获取指定窗体的数据,例如:
string userName=this.Request.Form["UserName"];
string passWord =this.Request.Form["PassWord"];
2、通过Request.QueryString获取查询字符串参数值,例如:
string searchKeyWord=this.Request.QueryString["searchKeyWord"];
3、通过Request.Cookies获取Cookie值,例如:
string userName=this.Request.Cookies["UserName"].Value;
4、也可以模糊的使用Request来获取请求数据,这样获取的数据可能是窗体数据也可能是查询字符串参数值和Cookie。但是这样会造成性能上的一些损失,不建议使用。例如:
string userName=this.Request["UserName"];
四、Request.ServerVariables属性
也就是HttpRequest.ServerVariables表示获取Web服务器变量的集合,允许读取HTTP头。可以通过使用"HTTP_"这个前缀来读取任何HTTP的头部信息。
1、 Request.ServerVariables["Url"] 返回服务器地址
2、Request.ServerVariables["Path_Info"] 客户端提供的路径信息
3、Request.ServerVariables["Appl_Physical_Path"] 与应用程序元数据库路径相应的物理路径
Request.ServerVariables["Path_Translated"] 通过由虚拟至物理的映射后得到的路径
Request.ServerVariables["Script_Name"] 执行脚本的名称
Request.ServerVariables["Query_String"] 查询字符串內容
Request.ServerVariables["Http_Referer"] 请求的字符串內容
Request.ServerVariables["Server_Port"] 接受请求的服务器端口号
Request.ServerVariables["Remote_Addr"] 发出请求的远程主机的IP地址
Request.ServerVariables["Remote_Host"] 发出请求的远程主机名称
Request.ServerVariables["Local_Addr"] 返回接受请求的服务器地址
Request.ServerVariables["Http_Host"] 返回服务器地址
Request.ServerVariables["Server_Name"] 服务器的主机名、DNS地址或IP地址
Request.ServerVariables["Request_Method"] 提出请求的方法比如GET、HEAD、POST等等
Request.ServerVariables["Server_Port_Secure"] 如果接受请求的服务器端口为安全端口时,则为1,否则为0
Request.ServerVariables["Server_Protocol"]服务器使用的协议的名称和版本
Request.ServerVariables["Server_Software"]应答请求并运行网关的服务器软件的名称和版本
Request.ServerVariables["All_Http"]客户端发送的所有HTTP标头,前缀HTTP_
Request.ServerVariables["All_Raw"]
客户端发送的所有HTTP标头,其结果和客户端发送时一样,没有前缀HTTP_
Request.ServerVariables["Appl_MD_Path"]应用程序的元数据库路径
Request.ServerVariables["Content_Length"]客户端发出內容的长度
Request.ServerVariables["Https"]如果请求穿过安全通道(SSL),则返回ON如果请求来自非安全通道,则返回OFF
Request.ServerVariables["Instance_ID"]IIS实例的ID号
Request.ServerVariables["Instance_Meta_Path"]响应请求的IIS实例的元数据库路径
Request.ServerVariables["Http_Accept_Encoding"]返回內容如:gzip,deflate
Request.ServerVariables["Http_Accept_Language"]返回內容如:en-us
Request.ServerVariables["Http_Connection"]
返回內容:Keep-Alive
Request.ServerVariables["Http_Cookie"]
返回內容如:nVisiT%
2DYum=125;ASPSESSIONIDCARTQTRA=FDOBFFABJGOECBBKHKGPFIJI;ASPSESSIONIDCAQQTSRB=LKJJPLABABILLPCOGJGAMKAM;ASPSESSIONIDACRRSSRA=DK
HHHFBBJOJCCONPPHLKGHPB
Request.ServerVariables["Http_User_Agent"]返回內容:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)
Request.ServerVariables["Https_Keysize"]安全套接字层连接关键字的位数,如128
Request.ServerVariables["Https_Secretkeysize"]服务器验证私人关键字的位数如1024
Request.ServerVariables["Https_Server_Issuer"]服务器证书的发行者字段
Request.ServerVariables["Https_Server_Subject"]服务器证书的主题字段
Request.ServerVariables["Auth_Password"]当使用基本验证模式时,客户在密码对话框中输入的密码
Request.ServerVariables["Auth_Type"]是用户访问受保护的脚本时,服务器用於检验用户的验证方法
Request.ServerVariables["Auth_User"]代证的用户名
Request.ServerVariables["Cert_Cookie"]唯一的客户证书ID号
Request.ServerVariables["Cert_Flag"]客户证书标誌,如有客户端证书,则bit0为0如果客户端证书验证无效,bit1被设置为1
Request.ServerVariables["Cert_Issuer"]用户证书中的发行者字段
Request.ServerVariables["Cert_Keysize"]安全套接字层连接关键字的位数,如128
Request.ServerVariables["Cert_Secretkeysize"]服务器验证私人关键字的位数如1024
Request.ServerVariables["Cert_Serialnumber"]客户证书的序列号字段
Request.ServerVariables["Cert_Server_Issuer"]服务器证书的发行者字段
Request.ServerVariables["Cert_Server_Subject"]服务器证书的主题字段
Request.ServerVariables["Cert_Subject"]客户端证书的主题字段
Request.ServerVariables["Content_Type"]客户发送的form內容或HTTPPUT的数据类型
Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 可以获得位于代理(网关)后面的直接IP,当然必须这个代理支持
一些被隐藏起来的Request.ServerVariables参数:
Request.ServerVariables["NUMBER_OF_PROCESSORS"]
Request.ServerVariables["OS"]
Request.ServerVariables["WINDIR"]
Request.ServerVariables["TEMP"]
Request.ServerVariables["TMP"]
Request.ServerVariables["ComSpec"]
Request.ServerVariables["Os2LibPath"]
Request.ServerVariables["Path"]
Request.ServerVariables["PATHEXT"]
Request.ServerVariables["PROCESSOR_ARCHITECTURE"]
Request.ServerVariables["PROCESSOR_IDENTIFIER"]
Request.ServerVariables["PROCESSOR_LEVEL"]
Request.ServerVariables["PROCESSOR_REVISION"]
本机ip:<%=request.servervariables["remote_addr"]%>
服务器名:<%=Request.ServerVariables["SERVER_NAME"]%>
服务器IP:<%=Request.ServerVariables["LOCAL_ADDR"]%>
服务器端口:<%=Request.ServerVariables["SERVER_PORT"]%>
服务器时间:<%=now%>
IIS版本:<%=Request.ServerVariables["SERVER_SOFTWARE"]%>
脚本超时时间:<%=Server.ScriptTimeout%>
本文件路径:<%=server.mappath(Request.ServerVariables["SCRIPT_NAME"])%>
服务器CPU数量:<%=Request.ServerVariables["NUMBER_OF_PROCESSORS"]%>
服务器解译引擎:<%=ScriptEngine & "/"& ScriptEngineMajorVersion&"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统:<%=Request.ServerVariables["OS"]%>
支持的文件类型:<%=Request.ServerVariables["HTTP_Accept"]%>
访问的文件路径:<%=Request.ServerVariables["HTTP_url"]%>
用户代理的信息:<%=Request.ServerVariables["HTTP_USER_AGENT"]%>
Request.ServerVariables变量意义. http代理相关知识
Request.ServerVariables["HTTP_VIA"]---------可以获得用户内部的ip
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]---------可以知道代理服务器的服务器名以及端口
Request.ServerVariables["REMOTE_ADDR"]-- 发出请求的远程主机的 IP 地址。
五、http代理相关知识
关键就在HTTP_X_FORWARDED_FOR
使用不同种类代理服务器,上面的信息会有所不同:
1、没有使用代理服务器的情况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
2、使用透明代理服务器的情况:Transparent Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
3、使用普通匿名代理服务器的情况:Anonymous Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
4、使用欺骗性代理服务器的情况:Distorting Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
5、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示