0

Static1UrlURL文字列を前に保留する仕事をする.csに関数があります:

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>

私を怠け者と呼んでください。しかし、私はもっと単純な解決策、できればページの上部にあるインポートを含まない解決策を好みますが、長い関数呼び出しを使用しなければならないという意味ではありませんでした。これは可能ですか?

編集(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

答えは、あなたが本当に望んでいるものに応じて「はい」と「いいえ」だと思います。2つの考慮事項があります。質問に示されている状況では最初の選択肢に反対することをお勧めしますが、これは非常に類似した状況で役立ちます。この1番目のオプションは、尋ねられた質問により直接的に答えますが、私が信じていることに関しては2番目の方がより良い答えだと思います本当に欲しい。

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、メソッドでその変数を使用しておらず、実際には拡張メソッドの意図された使用法ではないため、この使用法には反対することをお勧めします。私はこの種の使用を「スロップ」と呼んでいます。しかし、私がこれを使用する良い方法は、次の拡張メソッドです。

    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 = "?")

コレクションにはRequestPage インスタンスが必要なので、この例は非常に当てはまります。また、Web ページ内から簡単に呼び出すことができます: this.RequestFQ("myKey");.

今、私があなたの最善の解決策だと思うのは:

2: あなたの本当の質問は、呼び出しの名前を短くして、長い 'GlobalSiteFunctions.Static1Url()' をすべて持たないようにすることだと私には思えます。usingステートメントは長いクラス名の名前を変更できるWebsite2012.GlobalSiteFunctions.Static1Url(...)ため、.g.Static1Url(...)usingusing g = Website2012.GlobalSiteFunctions;

したがって、あなたの質問は、OOP 設計を回避できるかどうかを具体的に尋ねていますが、技術的には、いいえ、できません。ただし、私が提供するこの 2 番目のオプションを使用して、メソッドを呼び出すために使用する必要がある文字の長さを短くすることができます。これが本当にあなたが望んでいることのように思えます。

ハッピーコーディング!

于 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 に答える