最佳实践:将ID转换为专有名称

时间:2013-11-18 17:09:48

标签: c# asp.net asp.net-mvc design-patterns

我今天正在研究一个MVC项目,我遇到了一个问题,我无法找到最佳实践。

考虑我有一个用户,每个用户都有一个UserType-ID或Code(不一定要驻留在另一个表中)。在这种情况下,UserType不在另一个表中,但是是硬编码的。但是在将来,应该从持久层加载 ID 1是管理员 ID 2是主持人
ID 3是普通用户。

现在我有一个普通的用户的索引,创建,编辑视图,UserType Id是UserTypes的下拉列表。

到目前为止,代码在Controller中构建了SelectList,并且它都是硬编码的。

在索引页面上,我想显示用户类型“name”,而不是代表该用户的id。

所以我结束了,在Controller中保留了硬编码值,在UserViewModel中,我添加了一个“UserTypeStr”属性,它将为我提供该用户类型的名称。

像这样:

public class User
{
    public int UserType{get;set;}
    // other fields...

    public string UserTypeStr
    {
        get
        {
            switch(UserType)
            {
                case 1: return "Admin";
                case 2: return "Moderator";
                // ... and so on
            }
        }
    }
}

现在这段代码不能很好地扩展,现在我有了重复的代码,这有点像死的东西。

我不完全确定,解决这个问题的最佳方法是什么。我有一些想法,我可以将它们放在一个类中,可以是一个专用的ViewModel类,一个Factory或类似的东西,但我觉得它不对。

我期待着你们如何解决这个问题。

顺便说一句,我知道这不是很好的设计,但我的时间有限,所以我没有重构过多的代码。

我应该注意 代码必须扩展,以便以后可以添加到数据库中并进行翻译。

3 个答案:

答案 0 :(得分:2)

您可以创建一个Dictionary<int, string>来保存UserTypeId和UserTypeValue列表,并将此列表放在一个公共位置。

然后,您可以根据UserType或用户与列表之间的内部联接(使用LINQ)对列表进行查找

答案 1 :(得分:1)

创建enum配给:

public enum UserType {
    NotSet = 0,
    Admin,
    Moderator
}

public class User
{
    public UserType Type {get; set; }

    public string TypeOfUser() {
        return Type.ToString();
    }
}

这种方法可以扩展并且是常见的做法(具有数据库枚举的枚举映射)。如果做出改动,它确实需要重新编译,但我不会将其标记为“不可扩展”......

答案 2 :(得分:0)

您可以使用带有Description属性

的枚举
private enum UserTypeEnum
{
    [Description("Administrator")]
    Admin,
    [Description("Moderator")]
    Mod
};

public UserTypeEnum UserType;
public string UserTypeStr { get {return UserType.ToString();} }