如何最好地处理C#ASP.NET Web应用程序中的动态页面设置?

时间:2011-10-14 13:52:58

标签: c# asp.net

我有一个页面,它根据某些条件以某种方式配置了许多控件(例如,如果它是访问该页面的用户或管理员)。我目前如何实现这一点是通过为所有页面共有的设置提供接口,然后扩展实现特定于用户类型的属性的类。

例如:

public interface Display_Type
{
    string backgroundColor { get; }
}

public class AdminPage : Display_Type
{
    string backgroundColor { get { return "orange"; } }
}

public class UserPage : Display_Type
{
    string backgroundColor { get { return "blue"; } }
}

我的网页代码隐藏:

public partial class MyPage : System.Web.UI.Page
{
    Display_Type pageSettings;

    protected void Page_Load(object sender, EventArgs e)
    {
        if ((bool)Session["Is_Admin"])
        {
            pageSettings = new AdminPage();
        }
        else
        {
            pageSettings = new UserPage();
        }

        // ...

        string backgroundColor = pageSettings.backgroundColor;
        // ... Do stuff with background color
    }
}

这对我来说很好,但由于这些设置在整个应用程序中是不变的,因此它们似乎更像是静态类。但是,我无法弄清楚如何执行此操作,因为我无法为变量分配静态类。

我的问题是:

  1. 我有更好的方法可以完成我在这里要做的事吗?
  2. 或者,如果这没关系,我怎么能完成我对静态类/成员所做的事情呢?
  3. 值得注意的是,用户/管理员示例不是我在我的Web应用程序中使用此结构的方式,实际上与用户本身无关,而是与请求参数等其他因素无关。

6 个答案:

答案 0 :(得分:2)

将您的设置放在BasePage上,并从中获取其他页面。

您只需设置一次设置。

public abstract class MyBasePage : System.Web.UI.Page
{
    protected Display_Type PageSettings { get; private set; };

    protected void Page_Load(object sender, EventArgs e)
    {
        if ((bool)Session["Is_Admin"])
        {
            PageSettings = new AdminPage();
        }
        else
        {
            PageSettings = new UserPage();
        }
    }
}

public partial class MyPage : MyBasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // ...

        string backgroundColor = PageSettings.backgroundColor;
        // ... Do stuff with background color
    }
}

答案 1 :(得分:0)

这不是我会这样做的,但如果你这样做,静态类与这种情况完全无关,也没用。

可能考虑将每个Display_Type类的单个实例存储在某个地方以供重用,而不是每次都创建一个新实例。这可能最终成为一个静态变量......但这与静态类完全不同。

答案 2 :(得分:0)

您可以使用单身人士定义AdminPageUserPage个人资料,并为您的实施添加静态方法GetDisplayType()

答案 3 :(得分:0)

public static class PageTypes {
    public static PageType Admin(/** stuff here */);
    public static PageType User(/** stuff here */);
}

public class PageType {
    readonly string _backgroundColor;
    public PageType (/** stuff here */) {
        _backgroundColor = backgroundColor;
    }

    public string BackgroundColor {
        get {
            return _backgroundColor;
        }
}

现在,您可以在方法中访问它们:

if ((bool)Session["Is_Admin"])           
{               
    PageSettings = PageTypes.Admin;    
}           
else           
{               
    PageSettings = PageTypes.User;
}

我同意Jakub关于使用基类来防止代码重复。

答案 4 :(得分:0)

<强> 1。有没有更好的方法可以完成我在这里尝试做的事情?

Microsoft .NET具有内置的应用程序设置实现:设置文件。如果每个用户都无法配置您的设置,请使用它们。

应用程序设置可以在附属程序集中定义,并在应用程序的app.configweb.config中覆盖。

我觉得使用设置文件定义这样的设置会更好,这是一个内置的,可理解的,实现良好的解决方案,你可以开箱即用。

如何使用设置文件来实现目标?

您可以按惯例使用配置,背景颜色设置如下所示:

  • AdminPage_BackgroundColor =&gt; #000000
  • UserPage_BackgroundColor =&gt; #FFFFFF
  • 等等

在您的情况下,两个页面都有两种背景颜色设置,但如果您需要为任何页面配置背景颜色,则可以在页面派生的类实例中执行此操作:

Properties.PagesStyle.Default[GetType().Name + '_' + "BackgroundColor"]

您将能够逐页获取背景颜色和设置文件。

让我们在你的页面类中实现这个:

public partial class MyPage : System.Web.UI.Page
{
    Color backgroundColor = null;

    protected void Page_Load(object sender, EventArgs e)
    {
        if ((bool)Session["Is_Admin"])
        {
            backgroundColor = Properties.PagesStyle.Default.AdminPage_BackgroundColor;
        }
        else
        {
            backgroundColor = Properties.PagesStyle.Default.UserPage_BackgroundColor;
        }

        // ... Do stuff with background color
    }
}

注意设置文件允许您定义强类型值。假设您输入“UserPage_BackgroundColor”作为System.Drawing.Color,设计师将使用颜色选择器编辑颜色,当您访问此设置时,您将获得System.Color

在开始另一种方法之前,请检查以下有用的链接:


推荐方法

有一种稳固,稳定且有价值的网站样式:CSS。

不要创建自己的样式方法,只需使用CSS类。

例如,在某些CSS样式表中,您为管理页面用户页面定义了两种背景颜色:

body.UserPage
{
    background-color: #000;
}

body.AdminPage
{
    background-color: #FFF;
}

想象一下你有这个ASP.NET页面(我只包括标准的XHTML标记):

<html>
  <head></head>
  <body id="body" runat="server"></body>
</html>

在您的代码隐藏代码中,您可以这样做:

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if ((bool)Session["Is_Admin"])
        {
            body.Attributes["class"] = "AdminPage";
        }
        else
        {
            body.Attributes["class"] = "UserPage";
        }
    }
}

这样你可以避免:

  • 创建冗余设置,因为您使用CSS作为样式机制(不要重新发明轮子!)。
  • 编译样式值:它是客户端的东西,因为它是CSS。

答案 5 :(得分:-1)

要回答第二个问题,请执行静态解决方案:

public interface IDisplayType
{
    string backgroundColor { get; }
}

public class AdminPage : IDisplayType
{
    public string backgroundColor { get { return "orange"; } }
}

public class UserPage : IDisplayType
{
    public string backgroundColor { get { return "blue"; } }
}

public static class PageProperties
{
    private static AdminPage _adminPage = new AdminPage();
    private static UserPage _userPage = new UserPage();

    public static IDisplayType DisplayType { get
    {
        if ((bool)HttpContext.Current.Session["Is_Admin"])
         {
            return _adminPage;
         }

        return _userPage;
    }
 }

我还将Display_Type类型更改为IDisplayType,它给出了它的内容描述。

然后,您可以在页面中使用以下代码。

string backgroundColor = PageProperties.DisplayType.backgroundColor;