在我当前的asp.net mvc项目中,用户应该能够登录。登录后,可以选择设置一组首选项。其中一些偏好是一般的(例如首选的网站语言等),但有些只是特定于此项目(预定义的查询过滤等)。
由于这些首选项存在于我网站的许多不同位置,因此我将其定义为交叉关注点。我最好有一个属性来处理它,而不是每个动作都自己处理。
我如何设计这样一个足够通用的属性,以便在未来的项目中重复使用,但是对当前项目的了解程度是否足以使用所有项目特定的设置呢?
- 编辑 -
获取和设置首选项不是问题。我将UserSettings类连接到asp.net配置文件提供程序。
我的问题是如何将我的控制器中的这个交叉问题转化为属性。
答案 0 :(得分:0)
如果您将这些首选项存储在文本文件,xml或数据库中,则不会更容易创建一个类(例如Utility.UserPreferences),它将从用户加载这些首选项并将它们存储在Session变量中,然后使用枚举调用它们来检索/更新
namespace Utility
{
public class UserPreferences
{
public UserPreferences(int userID)
{
// Load Preferences from text file, xml file or DB
string loadedPreferences = "us|20|yes|no";
HttpContext.Current.Session["userPreferences"] = loadedPreferences;
}
public void Savepreferences(string[] pref, int userID)
{
// Save preferences for that user
}
public static string GetPreferences(PreferencesType type)
{
string[] pref = HttpContext.Current.Session["userPreferences"].ToString().Split('|');
switch (type)
{
case PreferencesType.Language: return pref[0];
case PreferencesType.ShowHowManyResults: return pref[1];
case PreferencesType.ShowNavigation: return pref[2];
case PreferencesType.GetEmailAlerts: return pref[3];
}
}
public enum PreferencesType
{
Language, ShowHowManyResults, ShowNavigation, GetEmailAlerts
}
}
}
然后......
// Login sucessfully...
Utility.UserPreferences pref = new Utility.UserPreferences(CurrentUser.ID);
// to retrieve a preference
string language = Utility.UserPreferences.GetPreferences(
Utility.UserPreferences.PreferencesType.Language,
CurrentUser.ID);
这只是一个想法...我会这样做...它很简单,它的项目很宽,因为你只需要改变课程以保持更多的偏好......
答案 1 :(得分:0)
对于用户首选项,您应该使用ASP.NET Profile Provider框架。一些资源:
您可以在配置文件提供程序框架之上构建基于属性的用户首选项处理,但我想这类特定于您的应用程序。