aspx页面的全局功能

时间:2012-09-06 09:26:30

标签: c# asp.net

我在.cs中有一个函数Static1Url,它可以预先处理一个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>

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

编辑(为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;
    }
}

3 个答案:

答案 0 :(得分:1)

不,不是。您至少需要类名才能访问静态方法(如果您在上面包含命名空间)。如果您不包含命名空间,则必须通过命名空间访问它,如示例中所示。

Website2012.GlobalSiteFunctions.Static1Url

答案 1 :(得分:1)

我认为答案是&#39;是&#39;和&#39;不&#39;取决于你真正想要的东西。我有两个注意事项。我建议在问题中出现的第一种情况,但这对于非常类似的情况很有用,第一种选择会更直接地回答问题的问题,但我相信第二种情况更好回答我认为真正需要的东西。

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,并且它实际上不是扩展方法的预期用途,我建议不要使用这种用法。我称之为使用&#39; slop&#39;。但是我使用它的一个好方法是这种扩展方法:

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

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

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

2:在我看来,你真正的问题是你打电话给一个较短的名字,这样你就不会拥有你所有冗长的GlobalSiteFunctions.Static1Url()&#39;。我提醒您(或启发您的事实)using语句可以重命名您的长姓名,以便Website2012.GlobalSiteFunctions.Static1Url(...)可以g.Static1Url(...)使用using语句调用using g = Website2012.GlobalSiteFunctions; class ActivitiesController < ApplicationController def index #Added .public @activities = Activity.visible.order("created_at desc").where(user_id: current_user.following_ids) end end class Activity < ActiveRecord::Base belongs_to :user has_many :comments, as: :commentable belongs_to :trackable, polymorphic: true scope :visible, ->{ where(:hidden => false) } def visible? !hidden end end create_table "activities", force: true do |t| t.boolean "hidden", default: false t.integer "user_id" t.string "action" t.integer "trackable_id" t.string "trackable_type" t.datetime "created_at", null: false t.datetime "updated_at", null: false end

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

快乐的编码!

答案 2 :(得分:0)

我想到的解决方案是覆盖Page Class,在覆盖的Page Class中,记下你的函数并从派生类继承你的每一页,这样你就可以在不使用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>