目的:在App_code中建一个类,实现一些公共操作,代码如下
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Text;
using System.Web.Security;
using System.Web.UI;
using System.Web.SessionState;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text.RegularExpressions;
/// <summary>
/// Common 的摘要说明
/// </summary>
public class Common : System.Web.UI.Page
{
public Common()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 获取querystring
/// </summary>
/// <param name="s">参数名</param>
/// <returns>返回值</returns>
public static string q(string s)
{
if (Request.QueryString[s] != null)
{
return Request.QueryString[s].ToString();
}
return string.Empty;
}
/// <summary>
/// 获取post得到的参数
/// </summary>
/// <param name="s">参数名</param>
/// <returns>返回值</returns>
public static string f(string s)
{
if (Request.Form[s] == null) return string.Empty;
return Request.Form[s];
}
调用时: Response.Redirect("http://www.cnblogs.com/Logon.aspx?BackID=" + Common.q("ID"));
结果报错:非静态的字段、方法或属性“System.Web.UI.Page.Request.get”要求对象引用。
此种情景下用一些朋友提供的解决方案,如放在page_load下就不适用了,或者改为
public String Temp {
get{return Request.Params["iCustomerId"];} //报错:System.Web.HttpException: 请求在此上下文中不可用
},调用时
Common cm=new Common()
string ss=cm.Temp.toString();
的方式也报错:System.Web.HttpException: 请求在此上下文中不可用
我的解决方案:
1. 添加前缀 "HttpContext.Current" 。(有的朋友不提倡这种方式,不知为何)
/// <summary>
/// 获取querystring
/// </summary>
/// <param name="s">参数名</param>
/// <returns>返回值</returns>
public static string q(string s)
{
if (HttpContext.Current.Request.QueryString[s] != null)
{
return HttpContext.Current.Request.QueryString[s].ToString();
}
return string.Empty;
}
/// <summary>
/// 获取post得到的参数
/// </summary>
/// <param name="s">参数名</param>
/// <returns>返回值</returns>
public static string f(string s)
{
if (HttpContext.Current.Request.Form[s] == null) return string.Empty;
return HttpContext.Current.Request.Form[s];
}
2. 继承方式
Common下的方法定义如下(没什么特殊的,就按常规定义):
public string q(string s)
{
if (Request.QueryString[s] != null)
{
return Request.QueryString[s].ToString();
}
return string.Empty;
}
引用页(如NewsList):
public partial class NewsList: Common //将本页定义为继承自Common
{
Response.Redirect("http://www.cnblogs.com/Logon.aspx?BackID=" + q("ID"));
}
结论:虽然解决方法找到了,但是内在原因不是很明了,请高手指导!
发现对一些类的实例化及静态方法调用方面的理解还有很大欠缺。最近经常发现在一些本以为不会出问题的地方栽跟头,还需要加强基本功啊!!
续:找到一些关于此问题的解释
【Question:】
can someone tell me the difference between the httpcontext and
httpapplication object, they seems to have similar methods, such as
getting the Response, REquest, Server
variables
【Answer:】
Request/Server/Session are the same.
HttpApplication actually uses the context to return them...
Here's the code for the HttpApplication.Request:
public HttpRequest Request
{
get
{
HttpRequest request1 = null;
if ((this._context != null) && !this._hideRequestResponse)
{
request1 = this._context.Request;
}
if (request1 == null)
{
throw new
HttpException(HttpRuntime.FormatResourceString("Re quest_not_available"));
}
return request1;
}
}
【When you are in a page/usercontrol...just use Request and Response no need
to use Application.Request and HttpContext.Current.Request. They are
properties exposed by the Control class.】
【when you are in a non-control class, use
HttpContext.Current.Request/Response/....】
Other than that, they do offer different functionality. They also offer
different storage capabilities
【request 与 context.request 没有区别
Page 页中 实际上也是用到 System.Web.HttpContext.Current.Request
他调用的函数是:
public HttpRequest Request { get{return System.Web.HttpContext.Current.Request;} }
只要在同一个网站中 他们两获取的值都是一样的
可以放心使用】

浙公网安备 33010602011771号