我今天正在研究一个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或类似的东西,但我觉得它不对。
我期待着你们如何解决这个问题。
顺便说一句,我知道这不是很好的设计,但我的时间有限,所以我没有重构过多的代码。我应该注意 代码必须扩展,以便以后可以添加到数据库中并进行翻译。
答案 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();} }