在HTML.EnumDropDownListFor

时间:2017-05-23 10:43:21

标签: c# asp.net asp.net-mvc html-helper

到目前为止,我有这样的事情:

public enum MyEnum
{
    [Display(Name="FirstElement")]
    element1 = 1,
    [Display(Name="SecondElement")]
    element2 = 2
}

在视图中,如果我使用:

Html.EnumDropDownListFor(x=>x.EnumProperty)

拥有:

public MyEnum EnumProperty {get;set;}

在视图模型上,下拉列表按预期工作(我看到FirstElement,附加的值为element1

问题在于我希望在值中加速,如下所示:

public enum MyEnum
{
    [Display(Name="FirstElement")]
    element1 = 1,
    [Display(Name="SecondElement")]
    element2 = 2,
    [Display(Name="Third")]
    element-dashed = 3
}

它不起作用,因为element-dashed不是有效条目。 这也不起作用:

[Value("element-dashed")]
[Display(Name="Third")]
elementDashed = 3

1 个答案:

答案 0 :(得分:0)

你的问题的答案很简单。但它需要一个解释,解释为什么这就是答案。

在枚举中没有功能性原因需要破折号。

假设我有一个有效的应用程序,其中包含您的枚举:

public enum MyEnum
{
    [Display(Name="FirstElement")]
    element1 = 1,
    [Display(Name="SecondElement")]
    element2 = 2
}

假设我更改了枚举器名称:

public enum MyEnum
{
    [Display(Name="FirstElement")]
    BatmanIsBruceWayne = 1,
    [Display(Name="SecondElement")]
    SupermanIsClarkKent = 2
}

我假设代码中每个enum的使用也都相应调整。如果在VS(F2)中使用重命名方法,则会自动出现这种情况。

关于应用程序的工作方式没有任何改变。从功能上讲,枚举的名称无关紧要。

public enum CardSuit { Hearts, Spades, Diamonds, Clubs }

public enum CardSuit { TheRedOne, TheBlackOne, TheOtherRedOne, TheOtherBlackOne }

当然,第一个对开发人员来说比第二个更易读。但是,编译器不关心枚举名称的含义。它只关心始终使用适当的值

这与变量名称的原理相同。虽然我们当然应该注意使开发人员可以读取变量名称;没有技术原因(即应用程序的功能)为什么我们应该使用int myDescriptiveInteger而不是int x
我们只选择一个描述性名称,以便为维护代码的人提供可读性。

只有一个例外:如果您在枚举上调用.ToString(),则为了使用您正在使用的字段的字符串表示。

注意:虽然这在技术上是可行的,而且之前已由其他人完成;我不知道这是不是你应该在这里做什么。您已经将明确的int值分配给枚举值。这些int值更容易保存/加载枚举,而不是尝试使用其等效的字符串。虽然两者在技术上都是可行的,但由于占用空间较小以及缺少您错误地尝试修复的命名问题,使用int会更好。

从您的问题中不清楚您是否属于这种情况。也许它已经在您的应用程序中的某个地方完成,也许它不是。没有你告诉我,我无法知道。

如果没有完成,那么您的问题在功能上无关紧要。除了可读性之外,这个名称并不重要,我相信你的开发人员不会突然停止理解代码的意图,因为缺少了一些冲突。

如果已完成,那么您实际上已经提供了问题的答案。而不是在枚举上调用.ToString();相反,您必须使用[Display(Name="FirstElement")]的值作为枚举的正确“字符串名称”

public static string GetName(this myEnum enumValue)
{
    return enumValue.GetType()
                    .GetMember(enumValue.ToString())
                    .GetCustomAttribute<DisplayAttribute>()
                    .GetName();
}

然后您可以更改以下代码:

myEnumValue.ToString();

以下代码正确使用属性的值而不是枚举字段名称:

myEnumValue.GetName();

在这两种情况下,核心答案都保持不变:您无需担心枚举字段的具体名称,因为它在功能上无关紧要

编辑如果您想要在组合框中以不同的方式显示枚举值,请在保存值时使用它,然后使用第二个属性来区分这两者。但原则仍然存在:不要让自己偏离字段名称而不是枚举使用。

我想再次强调你应该使用枚举的整数值。我没有理由为什么你会明确地为你的枚举赋值int然后拒绝使用它们。