我有一个页面,它根据某些条件以某种方式配置了许多控件(例如,如果它是访问该页面的用户或管理员)。我目前如何实现这一点是通过为所有页面共有的设置提供接口,然后扩展实现特定于用户类型的属性的类。
例如:
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
}
}
这对我来说很好,但由于这些设置在整个应用程序中是不变的,因此它们似乎更像是静态类。但是,我无法弄清楚如何执行此操作,因为我无法为变量分配静态类。
我的问题是:
值得注意的是,用户/管理员示例不是我在我的Web应用程序中使用此结构的方式,实际上与用户本身无关,而是与请求参数等其他因素无关。
答案 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)
您可以使用单身人士定义AdminPage
和UserPage
个人资料,并为您的实施添加静态方法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.config
或web.config
中覆盖。
我觉得使用设置文件定义这样的设置会更好,这是一个内置的,可理解的,实现良好的解决方案,你可以开箱即用。
如何使用设置文件来实现目标?
您可以按惯例使用配置,背景颜色设置如下所示:
在您的情况下,两个页面都有两种背景颜色设置,但如果您需要为任何页面配置背景颜色,则可以在页面派生的类实例中执行此操作:
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";
}
}
}
这样你可以避免:
答案 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;