存储数据库状态值的字符串版本

时间:2011-04-26 12:17:26

标签: asp.net-mvc asp.net-mvc-3 razor

我正在编写ASP.NET MVC 3站点,我需要从数据库中转换一些表示具有用户可读字符串的状态的整数值,例如:

...
<td>
@item.Status
</td>
...

我写了一个HTML Helper来进行转换:

    public static string MessageType(this HtmlHelper helper, int type)
    {
        string messageType = "Unknown";
        switch((Types.MessageTypes)type)
        {
            case Types.MessageTypes.Join:
                messageType = "Join App";
                break;
            case Types.MessageTypes.New:
                messageType = "New App";
                break;
        }

        return messageType;
    }

我将类型存储为Types类中的枚举。

我的问题是,是否有更清洁的方法来做到这一点?我不喜欢我的代码中的这些魔术字符串,它在代码的不同部分创建了许多依赖项。

有什么想法吗?

非常感谢, 萨姆

2 个答案:

答案 0 :(得分:2)

我通常用这样的DisplayAttribute来装饰枚举。

    enum MessageTypes
    {
       [Display(Name = "Join App")]   
       Join,
       [Display(Name = "New App")]     
       New
    }

然后我使用帮助器来提取它们:

    public static string EnumDisplay(this HtmlHelper helper, Enum model)
    {
        var enumType = model.GetType();
        var modelValue = Convert.ToInt64(model);

        var matches = from field in enumType.GetMembers()
                      where field.MemberType == MemberTypes.Field && Enum.IsDefined(enumType, field.Name)
                      let value = Convert.ToInt64(Enum.Parse(enumType, field.Name, false))
                      where modelValue == value
                      let attribute = field.GetCustomAttributes(typeof (DisplayAttribute), false).Cast<DisplayAttribute>().FirstOrDefault()
                      select attribute == null 
                          ? field.Name 
                          : attribute.Name;

        return matches.FirstOrDefault() ?? "Unknown";
    }

然后你可以做

  @Html.EnumDisplay((MessageType)item.MessageType)

答案 1 :(得分:0)

在我看来,您应该将相应的用户可读字符串存储在整数旁边的数据库中。并返回一个对象,例如StatusViewModel到视图模型。 View模型可能具有&gt;

class StatusViewModel
{

   int type;
   string displayMessage;
}

有道理吗?