ASP.NET 一般处理程序基础1(Get Post 表单提交 Http协议 Nvelocity模板引擎)

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代码中要指定路径和模版名称

原文地址:https://www.cnblogs.com/d685600/p/3635590.html