0

Static1Url在 .cs 中有一个函数,它可以预先挂起一个 URL 字符串:

namespace Website2012
{
    public static class GlobalSiteFunctions
    {

        /// <summary>Returns a formatted URL mapping to Static1 on a CDN.</summary>
        /// <param name="url">The URL to be formatted.</param>
        /// <returns>Formatted string.</returns>
        public static string Static1Url(string url)
        {
            return string.Format("{0}{1}", ConfigurationManager.AppSettings["Static1CDNUrl"], url);
        }
    }
}

我希望能够从这样的 aspx 页面访问它:

<p>This is the complete URL: <%= Static1Url("my-file-name.jpg") %></p>

目前,为了能够做到这一点,我必须使用以下代码:

<p>This is the complete URL: <%= Website2012.GlobalSiteFunctions.Static1Url("my-file-name.jpg") %></p>

如果我在页面顶部添加一个 Import 语句 ( <%@ Import Namespace="Website2012" %>),那么我现在可以使用以下内容:

<p>This is the complete URL: <%= GlobalSiteFunctions.Static1Url("my-file-name.jpg") %></p>

叫我懒惰,但我更喜欢更简单的解决方案,最好是在页面顶部不涉及 Import 的解决方案,但这并不意味着我必须使用冗长的函数调用。这可能吗?

编辑(为了 Imran Balouch 的利益)

我想出了这个处理多种页面类型的想法,这是一个好的做法:

public class MyPage : System.Web.UI.Page
{
    public static bool Test()
    {
        return Functions.Test();
    }
}

public class MyUserControl : System.Web.UI.UserControl
{
    public static bool Test()
    {
        return Functions.Test();
    }
}


private class Functions
{
    public static bool Test()
    {
        return true;
    }
}
4

3 回答 3

1

不,这不对。您至少需要类名才能访问静态方法(如果您包含上面的命名空间)。如果您不包含命名空间,那么您必须像示例中那样通过命名空间访问它。

Website2012.GlobalSiteFunctions.Static1Url
于 2012-09-06T09:28:21.443 回答
1

我认为答案是“是”和“否”,具体取决于您真正想要什么。我有两个考虑。我建议在问题中提出的情况下反对第一个,但这对于非常相似的情况很有用,并且这个第一个选项确实更直接地回答了所问的问题,但我相信第二个是我认为的更好的答案是真的很想要。

1:您可以在 System.Web.UI.Page 上使用扩展方法,以便您可以通过以下方式调用您的方法:this.Static1Url(...)。您的扩展方法看起来像这样:

public static string Static1Url(this System.Web.UI.Page p, string url)
{   return string.Format("{0}{1}", ConfigurationManager.AppSettings["Static1CDNUrl"], url);
}

但是因为您没有p在您的方法中使用该变量,并且它实际上不是扩展方法的预期用途,所以我建议不要使用这种用法。我将这种使用称为“slop”。但是我使用它的一个好方法是这个扩展方法:

    public static string RequestFQ(this System.Web.UI.Page p, string key, string valueForNullResult = "?")
    {   string v = p.Request.Form[key] ?? p.Request.QueryString[key];
        if (v == valueForNullResult) { v = null; }
        return v;
    } // public string RequestFQ(this System.Web.UI.Page p, string key, string valueForNullResult = "?")

集合需要Page实例,所以这个Request例子非常适用。从网页内部调用它很简单:this.RequestFQ("myKey");.

现在我认为是你最好的解决方案:

2:在我看来,你真正的问题是你把你的电话改成了一个更短的名字,这样你就没有冗长的'GlobalSiteFunctions.Static1Url()'。我提醒您(或启发您了解这一事实),一个语句using可以重命名您的长类名,因此Website2012.GlobalSiteFunctions.Static1Url(...)可以使用诸如.g.Static1Url(...)usingusing g = Website2012.GlobalSiteFunctions;

因此,您的问题专门询问您是否可以避免 OOP 设计,从技术上讲,不,您不能。但是您可以通过我提供的第二个选项来缩短调用方法所需的字符长度。在我看来,这确实是您想要的。

快乐编码!

于 2015-04-22T16:32:47.917 回答
0

我想到的解决方案是覆盖页面类,并在那个被覆盖的页面类中,写下你的函数并从派生类继承你的每一页,这样你就可以在不使用 import 语句的情况下使用它。

public class MyPage : System.Web.UI.Page
{
    protected string Static1Url(string url)
    {
        return string.Format("{0}{1}", ConfigurationManager.AppSettings["Static1CDNUrl"], url);
    }
}

比你的页面必须是这样的:

public partial class YourPage : MyPage
{

}

你可以像这样使用它:

<p>This is the complete URL: <%= base.Static1Url("my-file-name.jpg") %></p>
于 2012-09-06T09:30:21.897 回答