0

当我开始使用 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 代码隐藏页面等)。

棘手的一点是 app_code 中的类,即它们需要用来HttpContext.Current.访问该Response.Write方法。

我知道你可以通过将它作为公共类中的共享子来拥有“全局”功能,但这仍然需要双桶使用(我认为?)即tools.echo()

我的问题:是否有可能拥有一个不需要包含类的全局函数,如果是这样,如何让它具有类意识,即如果它在 app_code 类中使用,那么它需要使用HttpContext.Current.Response.Writevs code-可以Response直接访问的页面后面。

撇开我的坏习惯不谈,echo()实际上代码看起来比Response.Write()我想以这种方式全球化的其他一些方法要整洁得多 - 因此我的问题是:)

4

2 回答 2

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"); */
    }

}   
于 2013-02-25T15:57:39.790 回答
0

在 C# 中,您不能创建顶级函数。C# 编译器的开发人员 Eric Lippert 在这篇博文中解释了原因。

C# 从一开始就被设计为面向专业开发人员的大规模应用程序开发语言;它从未打算成为一种脚本语言。因此,它的设计鼓励将即使是很小的代码块也立即组织成组件。C# 是一种面向组件的语言。因此,我们希望鼓励以基于组件的风格进行编程,并阻止与这种风格相悖的功能。

至于你的技术问题,你必须在“你能”和“你应该”之间做出决定。

你能:如果你有真正的全局实用方法,我的直接想法是使用静态实用程序类或单例。您可以做到的另一种“技术”方法是创建object类型的扩展方法。 当心,后者是不好的做法。

你应该:我的建议是以 C# 的方式做 C# 的事情。

于 2013-02-25T14:59:17.623 回答