gpt4 book ai didi

c# - 管理数据库中持久的动态网站设置

转载 作者:太空狗 更新时间:2023-10-29 19:39:41 25 4
gpt4 key购买 nike

我正在尝试创建一些东西来在我们的 ASP.NET 网站中保存全局站点范围的设置 - 例如站点名称、谷歌分析帐号、facebook url 等......该站点可以有多个“品牌”或关联的子站点有了它,因此有了 sitguid 列,我们还希望可以选择将它们分组,因此是 group 列 - 例如测试和生产(通过 web.config appsetting 设置)。

我不希望在任何地方对任何 KEY 进行硬编码,但我希望能够在代码中尽可能简单地引用它们,例如SiteSetting.getSetting(“SiteName”)(这些可以在更多初级开发人员将创建的模板(母版页等)中使用)

我还希望能够在我们的管理控制台中管理现有设置并能够创建新设置。

数据类型列用于编辑表单,以便可以使用正确的输入元素,例如位类型的复选框,varchar 的文本框等...

SiteSettings 数据库表当前:

  [sts_sitGuid] [uniqueidentifier] NOT NULL, -- tells us which site the setting is for
[sts_group] [nvarchar](50) NOT NULL, -- used to group settings e.g. test/live
[sts_name] [nvarchar](max) NULL, -- the display name of the setting, for edit forms
[sts_alias] [nvarchar](50) NOT NULL, -- the name for the setting
[sts_value] [nvarchar](max) NOT NULL, -- the settings value
[sts_dataType] [nvarchar](50) NULL, -- indicates the control to render on edit form
[sts_ord] [tinyint] NULL, -- The order they will appear in on the admin form

我目前正在完成这项工作,但我对自己的工作方式不满意,并希望这里的任何人有任何可能有助于找到“正确”解决方案的建议!我敢肯定,在我之前人们已经这样做了。 (我会分享我到目前为止所拥有的,但不想以任何特定方式扭曲答案)我正在寻找的只是一个关于如何最好地完成它的概述,而不是寻找任何人为我写它; )

我在这里和谷歌都做了很多搜索,并没有真正找到我要找的东西,尤其是添加新设置“定义”以及编辑现有设置的能力。

该系统使用 webforms 在 ASP.NET 上运行,全部用 c# 编写并使用 MSSQL 2008。

与往常一样,非常感谢任何帮助!

编辑 :为了澄清,我将解释我到目前为止所构建的内容。我决定将所有这些存储在 SQL 中,因为我们不希望 web.config 或其他 xml 文件或其他数据库 float ,因为当我们向其他客户推出应用程序时,它会给我们更多工作。

到目前为止,我有一个 SiteSettings 类,它有一个 GetSetting 方法,我可以用 GetSetting("SettingAlias") 调用它来获取数据库中“SettingAlias”的值。此类的构造函数从数据库中获取当前站点的所有设置并将其存储在字典中,GetSetting 从该字典中读取。到目前为止,我对所有这部分都很满意。

我正在努力的部分是生成编辑表单。以前的版本使用网络服务来获取/设置设置,我正在尝试继续使用类似的东西来保存工作,但它们都在代码中定义,例如 GoogleAnalyticsID、Sitename 等......并且每个都有一个列在数据库中,我所做的更改是将这些设置存储为 ROWS(从那时起添加更多更容易,无需更改架构和所有 sitesettings 类)目前我的 SiteSettings 类有一个 SiteSettingsEditForm 方法,它可以获取所有来自数据库的信息,为表单元素创建一堆控件,将其放入临时页面并执行,然后通过 ajax 将生成的 HTML 传递给我们的管理系统。这感觉不对,有点笨拙,是在这里发布它的原因,我无法弄清楚如何通过 web 服务将这些东西保存回来,但更重要的是通过执行包含负载的页面生成一堆 HTML表单控件感觉像是错误的方法。

所以总而言之,我(我想我)想写一个类来缓存和读取数据库表中的一些行,并给我一个编辑表单(或将数据提供给其他东西以生成表单),即动态基于同一个数据库表的内容(例如,我的类型列是“位”我想要一个复选框,它是“文本”我想要一个文本输入)

最佳答案

如果您从数据模型开始,有时这种问题更容易可视化。如果您想要每行设置,那么两个表可能是存储它的最佳方式:

地点:

SiteId    SiteKey     SiteName1         XYGZ4345    Client Site 12         AZT43752    Client Site 2

This would define the list of sites you have config for. I'd use a SiteKey as you'd put this in your web.config and it's better to abstract this away into a random string or GUID (to make it harder to accidentally load someone else's config), the client can change their name and you don't get confused in the future as you didn't use their old name as a key etc etc.

The config table itself is also simple, if we treat every setting as a string:

SiteSetting:

SettingId    SiteId    SettingName    SettingValue1            1         Brand          KrustyBrand2            1         GoogleId       MSFTSUX0R3            2         Brand          ConfigMasters(TM)

You can then load all the config quite simply:

SELECT * FROM SiteSetting INNER JOIN Site ON (SiteSetting.SiteId = Site.SiteId) WHERE Site.SiteKey = 'XYGZ4345'

现在我们有了一个键值对列表,您可以将其存储在一个类中,例如:
public class SiteSetting
{
public Site Site {
get; set; //Site would just be a simple class consisiting of Id, Key and Name to match the database table
}

protected Dictionary<String, String> Settings { get; set; } //Simple key value pairs

}

所以这是一个非常简单的解决方案。但是,我们可以更进一步 - 需要考虑的事项:

1)我们可以在某个地方添加一个环境吗?

我们可以为每个环境添加一个站点

或者

将环境添加到 SiteSetting 表。这样做的好处是您可以定义 enironment = 'ALL' 以避免重复。

或者

加载配置的数据库定义环境;所以你在应用程序配置中更改配置连接字符串。当然,要连接到不同的环境,您必须更改 app.config,但无论如何您都可能必须这样做才能更改客户端 key 和/或环境。

2) 添加用户可定义设置的概念 - 一些您想要更改的设置,一些您想要锁定的设置。包含“UserDefinable”的位列将允许您对此进行排序

3) 设置类型。

这稍微困难一些。你可能有类似的东西:
PropertyId    PropertyName        PropertyType    Format          UserDefined1             Brand               String          NULL            12             DatePresentation    DateTime        "yyyy-MM-dd"    1

The Settings table then only defines a value, and a PropertyId. The advantage of this is that you can then start to increase the information about each setting you are storing, and reuse this information as the design is more normalized. The Settings class then changes like so:

public List<PropertyValue> { get; set; } //replacing the dictionary

PropertyValue 然后看起来像:
public class PropertyValue
{
int Id { get; set; }

public string Name { get; set; }

public string Value { get; set; }

public string PVType { get; set; } //Could be an enum

public string DisplayFormat { get; set;

private string _RawValue;

public string Value{
get{
switch(PVType){
case "DateTime":
return Convert.ToDateTime(_RawValue).ToString(DisplayFormat);
break;
case "Double":
return Convert.ToDouble(_RawValue).ToString(DisplayFormat);
break;
default:
return _RawValue;
}
}
set{
_RawValue = value;
}
}

}

需要改进诸如 Value 方法之类的东西以支持强大的错误处理(您也可以使用 Convert.ChangeType 进行调查以简化 switch block )

这个主题和你选择的一样简单或复杂;-)

编辑

至于维护它们;一个非常简单的 GUI 将允许用户以表格格式查看其所有属性。您可能会考虑将 UserDefinable = 0 的行设为只读,否则用户可以编辑和添加行。您需要进行验证,尤其是对于重复的设置名称。

最简单的方法是使用 DataGrid;一个简单的模型可能看起来像这样:

Mockup of Grid Edit

更复杂的方法可能类似于 this

因此,生成表单就像将一组 PropertyValue 对象数据绑定(bind)到您选择的网格解决方案一样简单。

关于c# - 管理数据库中持久的动态网站设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com