当我开始在asp工作时,发现它几乎不可能留下php的良好的旧echo()
功能 - 我的手在字面上输入它而不是response.write()
。
所以,在.net页面中我倾向于创建这样的东西:
Public Sub echo(ByVal strValue As String)
Response.Write(strValue)
End Sub
在.net类(即app_code文件夹中的类)中,我倾向于创建这样的东西:
Public Sub echo(ByVal strValue As String)
HttpContext.Current.Response.Write(strValue)
End Sub
虽然这样可以正常工作 - 但我希望将它放在应用程序级别,以便可以在任何地方使用(例如在类,aspx代码隐藏页面等中)。
Tricky位来到app_code中的类,即他们需要使用HttpContext.Current.
来访问Response.Write
方法。
我知道你可以通过将它作为公共类中的共享子来实现“全局”功能,但这仍然需要双桶使用(我认为?),即tools.echo()
我的问题:是否有可能拥有一个不需要包含类的全局函数,如果是这样的话,如何使它能够识别类,即如果它在一个类中使用app_code类然后需要使用HttpContext.Current.Response.Write
vs代码隐藏页面直接访问Response
。
除了我的坏习惯,echo()
实际上在代码中看起来比Response.Write()
&还有一些我希望以这种方式制作全球的方法 - 因此我的问题是:)
答案 0 :(得分:0)
在C#中,您无法创建顶级功能。 C#编译器开发人员Eric Lippert在this blog post中解释了原因。
C#旨在成为一种大规模的应用程序开发语言 从第一天开始面向专业开发者;它从来没有打算成为一个 脚本语言。因此,它的设计鼓励强制执行 立即将小块代码组织到组件中。 C#是一种面向组件的语言。因此,我们要鼓励 以基于组件的风格编程并阻止这些功能 反对那种风格。
至于你的技术问题,你必须在"你能和#34;之间作出决定。和#34;你应该"。
你可以:如果你有真正的全球性,实用的方法,我的想法是使用静态实用程序类或单例。另一个"技术"您可以这样做的方法是从object
类型创建扩展方法。 小心,后者是不好的做法。
你应该:我的建议是用C#方式做C#事。
答案 1 :(得分:0)
创建“辅助”函数以接受上下文作为参数。
public partial class MyPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
}
}
private void LogoutUser()
{
Helpers.SessionHelpers.LogoutUser(this.Context);
}
}
和
internal static class SessionVariableKeys
{
internal static readonly string USER_ID = "UserId";
}
和
internal static class SessionHelpers
{
internal static void LogoutUser(System.Web.HttpContext context)
{
context.Session[SessionVariableKeys.USER_ID] = null;
/* or */
context.Session.Remove(SessionVariableKeys.USER_ID);
/* or */
context.Session.RemoveAll();
/* and */
/* icing on the cake */
context.Session.Abandon();
/*context.Response.Redirect("SomePage.aspx"); */
}
}