1、ASP.NET MVC 纯洁 ASP.NET-----分为aspwebform 和asp mvc
2、ASP.NET MVC 访问数据库用到EF:涉及到ado.net,linq, ORM
3、借助Mono平台,将.NET运行到IOS Android
4、不能用Application统计在线人数,购物车的数据不能放到Session里面,不能使用LinkButtion做超链接(搜索引擎爬不到任何一个页面除了首页)
5、ASP.NET互联网开发和管理系统开发。
6、HttpHandler ashx返回内容
7、VS2012安全考虑IIS默认不允许访问目录
8、建立ashx,一般处理程序
public void ProcessRequest(HttpContext context) { string action=context.Request["name"];//请求name的值,放到action中 int age=Convert.ToInt32(context.Request["age"]); context.Response.Write("<font color='red'>Hello"+action+"</font>"); context.Response.Write("<font color='green'>我今年"+age+"岁</font>"); }
输入localhost3169/TestHandler.ashx?name=donghai&age=22&test=5
但是不想自己手动填写,需要进行页面的表单提交
<from action="TestHandler.ashx" method="get">//action把填的东西提交给哪一个服务器的页面 姓名:<input type="text" name="Username"><br/>//就是把input里面的内容提交给那么这个参数 年龄:<input type="text" name="password"><br/>//设为get就是把age,name以参数的形式放到url里 <input type="submit"> </form>
9、<input type="text" id="i1"name="Username"> html中id是唯一的不能重复的,但是元素的name 是可以重复的,若两个空间name相同,则都会提交
10、VIP的判断
<input type="checkBox" name="isVIP">
---------------------------------------
ashx里 string isVIP=context.Request["isVIP"];
context.Response.Write("<br/>"+isVIP);
这样的话,页面请求会返回on如果你勾上checkbox
在ashx加上if(isVIP=="on"){context.Response.Write("您是VIP");} else{ }
*********************************************只有input、textarea、select才会提交给服务 器
*********************************************只有三种属性的value值才会提交给服务器,标 签必须设置name属性
<textarea></textarea>
<select>
<option>福州</option>
<option>福州</option>
<option>福州</option>
</select>
11、GET和POST与数据如何传递没有关系
GET和POST是由HTTP协议定义的。在HTTP协议中,Method和Data(URL, Body, Header)是正交的两个概念,也就是说,使用哪个Method与应用层的数据如何传输是没有相互关系的。
<from action="TestHandler.ashx" method="get">//action把填的东西提交给哪一个服务器的页面 姓名:<input type="text" name="Username"><br/>//就是把input里面的内容提交给那么这个参数 年龄:<input type="text" name="password"><br/>// <input type="submit"> </form>
设为get就是把age,name以参数的形式放到url里,不安全。
------------------------------------------------------------------------------------------
把method改为post,这样地址栏上没有反应,不会写你的name age,但是network里面还是能看到的
,所以post以form data里发出去的。暂时理解为通过后台传过去了。历史记录里也不会看到。所以get通过url传递,post隐藏起来。get的url长度有限,但是post理论上无限的。
12、http协议是浏览器服务器之间的交互的协议,http不保持连接。数据库服务器就是长连接的
13、get/HTTP/1.1表示已get方式请求,使用http/1.1协议 404代表页面没有找到 200代表ok 302表示重定向//用IE开发人员工具来看
14、
context.Response.ContentType="text/html";
context.Response.Write("<a href='http://www.baidu.com'>百度</a>");
返回html。若改成context.Response.ContentType="text/plain"
则返回一个普通的文本。
15、进行登录的判断
context.Response.ContentType="text/plain"; string username=context.Request["username"]; stirng username=context.Request["password"]; if(username=="admin"&&password=="123") { context.Response.Write("ed2k://adfsafsdafsdafas"); } else { context.Response.Redirect("Cannot.html"); }
localhost:3169/VIP.ashx?username=admin&password=123---------------测试下
16、模板的需求,想把HTML和ashx结合起来。
context.Response.ContentType="text/html";//渲染成html String username=context.Request["username"]; String password=conetxt.Request["password"]; if(sting.IsNullOrEmpty(username)&&string.IsNullOrEmpty(password)) { context.Response.Write("<html>"); context.Response.Write("<head></head>"); context.Response.Write("<body><from action='login.ashx'><input type=‘text’name='username'/><input type='password' name='password'/><input> type='submit' value='登录'/><form></body>"); context.Response.Write("<html>"); }//如果用户名密码不为空则显示登录后的页面,否则提示登录 else { if(username=="admin"&&password="123") { context/Response.Write("<html><head></head><body>登陆成功</body></html>"); } else { context.Response.Write("<html>"); context.Response.Write("<head></head>"); context.Response.Write("<body><from action='login.ashx'><input type=‘text’ name='username' value='"+username+"'/><input type='password' name='password' value='"+password+"'/><input>type='submit' value='登录'/><form></body>");//将用户名和密码重新写回去,其实是重画出来的。 context.Response.Write("<html>"); context.Response.Write("<html><head></head><body>用户名密码错误</body></html>"); } }
----------------------------------这是把html页面直接放到ashx文件中,并且把用户填写的值,返回到textbox中,看起来好像是原来用户填写的,其实是重新画的。
这样就是if中对这个页面写入,else还要有同样的重写,所以这样太麻烦了,要有一种新的方式才可以,把工作简化。提出模板引擎
其实也可以不用模板引擎直接,把上面的replace掉,例如:
string html="<html><head></head><body><strong>登录</strong><form action='Login.ashx'><input type='text' name='username' value='{username}'/><input type='text' name='password' value='{password}'/><input type='submit' value="登录"/></form><p>{msg}</p></body></html>"; if(string .IsNullOrEmpty(username)&&string.IsNullOrEmty(password))//注意这句,都是string { string code=html.Replace("{username}",""); code=html.Replace("{password}",""); code=html.Replace("{msg}",""); conetxt.Response.Write(code); }
17、模板引擎有很多中,.NET中就有Nvelocity(http://www.castleproject.org/download/),他是从Java版本的Nvelocity移植过来的,StingTemplate、RazorEngin
<body>
<form action="Login.ashx">
用户名:<input type="text" name="username" value="$username"/><br/>
密码:<input type="text" name="username" value="$password"/><br/>
<input type="submit" value="登录">
</body>
把Value用$替换掉,Nvelocity是个程序集,需要添加对它的引用。
-----------------------------在ashx里面
用Nvelocity的代码,不用记,每次用的时候拷贝即可。
public void ProcessRequest(HttpContext context) { context.Response.ContentType="text/html"; string username=context.Request["username"]; string password=context.Request["password"]; if(string IsNullOrEmpty(username)&&string IsNullEmpty(password)) { VelocityEngine vltEngine = new VelocityEngine();//初始化模板引擎 vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");//代表模板是位于系统文件中的 vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//把一个服务器端的路径映射为物理路径,模板文件所在的文件夹,~/是位于项目根目录下 vltEngine.Init();//初始化 VelocityContext vltContext = new VelocityContext();//创建上下文,用来给模板传数据的 vltContext.Put("username", "");//设置参数,在模板中可以通过$username来引用,设置空 vltContext.Put("password",""); vltContext.Put("msg","");//有几个添加几个,根据自己需要 Template vltTemplate = vltEngine.GetTemplate("login.htm");//得到这个模板,写入自己的模板名字 System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); //return vltWriter.GetStringBuilder().ToString();//这个是写到函数里返回用的,不写在函数里的话可以这样 string html=vltWriter.GetStrigBuilder().ToString(); context.Response.Write(html);//把返回的这个值扔给浏览器就行了 } } else { if(username=="Admin"&&password=="123") { context.Response.Write("登录成功"); } else { VelocityEngine vltEngine = new VelocityEngine();//初始化模板引擎 vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file");//代表模板是位于系统文件中的 vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//把一个服务器端的路径映射为物理路径,模板文件所在的文件夹,~/是位于项目根目录下 vltEngine.Init();//初始化 VelocityContext vltContext = new VelocityContext();//创建上下文,用来给模板传数据的 vltContext.Put("username", "username");//设置参数,在模板中可以通过$username来引用,设置空 vltContext.Put("password","password"); vltContext.Put("msg","用户名或者密码错误");//有几个添加几个,根据自己需要 Template vltTemplate = vltEngine.GetTemplate("login.htm");//得到这个模板,写入自己的模板名字 System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); string html=vltWriter.GetStrigBuilder().ToString(); context.Response.Write(html);//把返回的这个值扔给浏览器就行了 } }
18、Nvelocity非常强大,给模板设置的属性如果有属性,还可以进一步获取,如$data.Person.Name
public class Person
{
public string Name{get;set;};
public string Age{get;set};
}
---------在ashx中
Person person=new Person();
person.Name="Tom";
person.Age="30";
..................//省略
vltContext.Put("p",Person);//直接可以把这个Person对象传进去
.................//省略
--------在html中可以直接$p.Name取值,//不要忘记这个html是在Template文件夹下的,vlt代码中要指定路径和模版名称