apsx85,求职准备07—今天复习到了,apsx与aspx.cs了,看来我也要说下CodeBehind了

最近没有闲着,最后再看了下net。规划下,这可能就是倒数第二次说net了,明天开始要慢慢转向数据结构了。
今天把最近学的总结下,明天可能把自己的系统优化知识(Asp.Net以及数据库)的积累简单说下,便暂时结束.net了。
小弟学的很浅,之前都在做项目积累,最近看了很多书籍感觉很有好处,但是比较弱的就是计算机网络以及数据结构,因为原来就没有学。所以算不上高手。
但是,院子里面的大家都很友善,特别是院子里面很多大哥的文章对小弟启发很大,在此非常感谢。
特别是以下几位大哥,真的感谢你们的文章,感觉结合你们的文章加上书籍启发很大。
求职准备07—今天复习到了,apsx与aspx.cs了,看来我也要说下CodeBehind了apsx85
好了,小弟简单总结下这两天的学习吧,各位大哥看看,顺便帮我指正下。
1 关于页面之间传值
这是个经常被问到的面试题,我们可以很简单的说有几种传值,然后依次列举,当然是及格。
但是,想要赢得面试官更好的印象我认为应该深入点,当然我肯定深入不了。
①URL传值:
当然不能只说在域名后面加?key=value就完了。
我就会说,url传值是将值存于HTTP头中,后台用QueryString便可获取。
其中中文会被编码,我们经常使用Ajax向后台传值,若是中文便会出现乱码,因为URL会对字符进行编码。
我们若是在后台不想得到乱码便要使用相应编码。
②Application传值
Application为HttpApplication的一个属性,其值为整个应用程序域共有,一般不用,常用于记录网站总访问量。
此处甚至可以与HttpApplication的几个事件以及Global.asax如何使用(说实话我是忘了......)
③net特有传值方式,设置按钮的postback指向
这个是个很好的发挥点,我也没有进行过研究,但是应该是设置了这个属性会将上次的页面中form表单中的服务器视图保留
到本页面的隐藏input中吧。
④cookie传值
cookie值存于客户端,有数量、长度限制,存于HTTP头中,根据域名会自动发往服务器,是客户端以及服务器沟通的桥梁。
⑤session传值
session值存于服务器,在没有禁用cookie情况下使用cookie标志用户信息,每次在服务器根据cookie健值取出服务器托管堆中
对应session对象值。在cookie禁用时候,健值便会以url传值。
我们 可以用一个静态类以及cookie模拟实现简单的session原理(这里吹的空间就大了)
其次,session默认存于IIS进程,而每当删除文件夹,修改webconfigsession便会丢失。
我们可以将session存于状态服务器,sql server 数据库,或者自定义程序中。
对于这个问题,我所能想到的便是这些。
2 get请求和post请求
①get请求提交的数据以url传值,而post将值放于Http Body中
②get传值长度有限制(url长度限制所导致),post可以任意。
③这点平时很多兄弟都忽略了,我们点击表单提交,并以post传值,那么会导致一个问题,我们点击刷新,数据又会重复提交,还会弹出警告框。而get便没有这一问题。
这个可以用response.redirect解决。虽然可以解决,但是也限制了post的可用性。
④默认为get请求,.net里面默认为post请求,若是使用get那么视图信息又会带来麻烦(我想是有麻烦 ,具体什么麻烦我没有研究)
3 最后说下aspx页面的CodeBehind问题
这个我做了个实验,截个图给大家看看
求职准备07—今天复习到了,apsx与aspx.cs了,看来我也要说下CodeBehind了apsx85
运行界面
求职准备07—今天复习到了,apsx与aspx.cs了,看来我也要说下CodeBehind了apsx85
前台及后台代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CodeBehindTest._Default" %>

无标题页
<
<%for (int i = 0; i < 10; i++) { Response.Write(i.ToString()+"
"); } %>
namespace CodeBehindTest { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write("
当前类型:"+this.GetType()); Response.Write("
当前类型dll位置:" + this.GetType().Assembly.Location); Response.Write("
当前类型父类:" + this.GetType().BaseType); Response.Write("
当前类型父类dll位置:" + this.GetType().BaseType.Assembly.Location); Page.PreLoad += new EventHandler(Page_PreLoad); } void Page_PreLoad(object sender, EventArgs e) { //throw new NotImplementedException(); } protected void Button1_Click(object sender, EventArgs e) { } } }

整个页面便是如此,我大概说说我的看法。
首先现在有三个文件:Default.aspx Default.aspx.cs Default.aspx.designer.cs
首先,Default.aspx.cs Default.aspx.designer.cs 为两个分部类 ,他们组成了_Default类
而我们有时候会在后台Default.aspx.cs文件中写一个方法直接以<%%>方式在前台页面调用。
这里便有个前提,那个方法或者字段必须为公有或者受保护的,我原来其实没大搞清楚为什么,之前看过一次又忘了。
今天大概搞清楚了。
现在,可以 把文件分为两个:前台代码:Default.aspx文件 以及Inherits="CodeBehindTest._Default" 指向的._Default.cs文件。
我们后台业务逻辑是在 _Default.cs文件中写的,但是.net framework最终编译时候,却不是用的这个文件。
事实上,最后编译器会临时生成一个类文件default_aspx(去掉命名空间后的名字),
编译器会先编译_Default.cs形成IL,然后以_Default.cs为父类以Default.aspx为基础构建一个临时类:default_aspx
这个default_aspx形成后,就没有什么Default.aspx了,最后JIT也是编译这个临时类。我大概画个图说明下情况画的丑是肯定的!
求职准备07—今天复习到了,apsx与aspx.cs了,看来我也要说下CodeBehind了apsx85
我把对应代码贴出来,在上面写点我自己理解的注释 ,若是有错,各位大哥便 指出来吧。
public class _Default : Page { // Fields protected Button Button1; protected DropDownList DropDownList1; protected HtmlForm form1; protected ImageButton ImageButton1; protected Label Label1; // Methods protected void Button1_Click(object sender, EventArgs e) { } protected void Page_Load(object sender, EventArgs e) { base.Response.Write("
当前类型:" + base.GetType()); base.Response.Write("
当前类型dll位置:" + base.GetType().Assembly.Location); base.Response.Write("
当前类型父类:" + base.GetType().BaseType); base.Response.Write("
当前类型父类dll位置:" + base.GetType().BaseType.Assembly.Location); this.Page.PreLoad += new EventHandler(this.Page_PreLoad); } private void Page_PreLoad(object sender, EventArgs e) { } }
[CompilerGlobalScope] public class default_aspx : _Default, IRequiresSessionState, IHttpHandler { // Fields private static object __fileDependencies; private static bool __initialized; // Methods [DebuggerNonUserCode] public default_aspx() { base.AppRelativeVirtualPath = "~/Default.aspx"; if (!__initialized) { string[] dependencies = new string[] { "~/Default.aspx" }; __fileDependencies = base.GetWrappedFileDependencies(dependencies); __initialized = true; } base.Server.ScriptTimeout = 0x1c9c380; } [DebuggerNonUserCode] private HtmlHead __BuildControl__control2() { HtmlHead __ctrl = new HtmlHead("head"); HtmlTitle __ctrl1 = this.__BuildControl__control3(); IParserAccessor __parser = __ctrl; __parser.AddParsedSubObject(__ctrl1); return __ctrl; } [DebuggerNonUserCode] private HtmlTitle __BuildControl__control3() { HtmlTitle __ctrl = new HtmlTitle(); IParserAccessor __parser = __ctrl; __parser.AddParsedSubObject(new LiteralControl("无标题页")); return __ctrl; } [DebuggerNonUserCode] private void __BuildControl__control4(ListItemCollection __ctrl) { ListItem __ctrl1 = this.__BuildControl__control5(); __ctrl.Add(__ctrl1); } [DebuggerNonUserCode] private ListItem __BuildControl__control5() { return new ListItem { Text = "dssd", Value = "dd" }; } [DebuggerNonUserCode] private Button __BuildControlButton1() { Button __ctrl = new Button(); base.Button1 = __ctrl; __ctrl.ApplyStyleSheetSkin(this); __ctrl.ID = "Button1"; __ctrl.Text = "Button"; __ctrl.Click -= new EventHandler(this.Button1_Click); __ctrl.Click += new EventHandler(this.Button1_Click); return __ctrl; } [DebuggerNonUserCode] private DropDownList __BuildControlDropDownList1() { DropDownList __ctrl = new DropDownList(); base.DropDownList1 = __ctrl; __ctrl.ApplyStyleSheetSkin(this); __ctrl.ID = "DropDownList1"; this.__BuildControl__control4(__ctrl.Items); return __ctrl; } [DebuggerNonUserCode] private HtmlForm __BuildControlform1() { HtmlForm __ctrl = new HtmlForm(); base.form1 = __ctrl; __ctrl.ID = "form1"; Label __ctrl1 = this.__BuildControlLabel1(); IParserAccessor __parser = __ctrl; __parser.AddParsedSubObject(__ctrl1); Button __ctrl2 = this.__BuildControlButton1(); __parser.AddParsedSubObject(__ctrl2); DropDownList __ctrl3 = this.__BuildControlDropDownList1(); __parser.AddParsedSubObject(__ctrl3); ImageButton __ctrl4 = this.__BuildControlImageButton1(); __parser.AddParsedSubObject(__ctrl4); __ctrl.SetRenderMethodDelegate(new RenderMethod(this.__Renderform1)); return __ctrl; } [DebuggerNonUserCode] private ImageButton __BuildControlImageButton1() { ImageButton __ctrl = new ImageButton(); base.ImageButton1 = __ctrl; __ctrl.ApplyStyleSheetSkin(this); __ctrl.ID = "ImageButton1"; return __ctrl; } [DebuggerNonUserCode] private Label __BuildControlLabel1() { Label __ctrl = new Label(); base.Label1 = __ctrl; __ctrl.ApplyStyleSheetSkin(this); __ctrl.ID = "Label1"; __ctrl.Text = "Label"; return __ctrl; } [DebuggerNonUserCode] private void __BuildControlTree(default_aspx __ctrl) { this.InitializeCulture(); IParserAccessor __parser = __ctrl; __parser.AddParsedSubObject(new LiteralControl("\r\n\r\n\r\n\r\n\r\n")); HtmlHead __ctrl1 = this.__BuildControl__control2(); __parser.AddParsedSubObject(__ctrl1); __parser.AddParsedSubObject(new LiteralControl("\r\n\r\n ")); HtmlForm __ctrl2 = this.__BuildControlform1(); __parser.AddParsedSubObject(__ctrl2); __parser.AddParsedSubObject(new LiteralControl("\r\n\r\n\r\n")); } private void __Renderform1(HtmlTextWriter __w, Control parameterContainer) { __w.Write("\r\n \r\n "); parameterContainer.Controls[0].RenderControl(__w); __w.Write("\r\n "); parameterContainer.Controls[1].RenderControl(__w); __w.Write("\r\n <"); parameterContainer.Controls[2].RenderControl(__w); __w.Write("\r\n \r\n \r\n \r\n "); parameterContainer.Controls[3].RenderControl(__w); __w.Write("\r\n \r\n
\r\n
\r\n \r\n "); for (int i = 0; i < 10; i++) { base.Response.Write(i.ToString() + "
"); } __w.Write("\r\n
\r\n "); } [DebuggerNonUserCode] protected override void FrameworkInitialize() { base.FrameworkInitialize(); this.__BuildControlTree(this); base.AddWrappedFileDependencies(__fileDependencies); base.Request.ValidateInput(); } [DebuggerNonUserCode] public override int GetTypeHashCode() { return 0x56974eb2; } [DebuggerNonUserCode] public override void ProcessRequest(HttpContext context) { base.ProcessRequest(context); } // Properties protected HttpApplication ApplicationInstance { get { return this.Context.ApplicationInstance; } } protected DefaultProfile Profile { get { return (DefaultProfile) this.Context.Profile; } } }

其中代码我大概读了一次,只读懂了一点 ,所以不好多说,我说下值得注意的地方,大家自己看看吧,等哪天我全部搞清楚了,我再重新说下。
_RenderForm方法将 依次按页面布局(这便是来源于我们前台页面文件 )加至容器,并一一将 控件呈现(控件 开发知识)
然后,_BuildControlForm中实例化所以控件,上面的方法其实是这里最后委托调用的。
至于,函数的入口点我其实还是不大清楚,我想应该是ProcessRequest,但是我拿不出实际证据。
还有一点,_Default类里面事件注册我还是不明白是在哪里注册的,知道的大哥拜托说下


Tags: 

延伸阅读

最新评论

发表评论