MVC 5.1剃刀DisplayFor不枚举显示名称工作 [英] MVC 5.1 Razor DisplayFor not working with Enum DisplayName
问题描述
我有以下的实体(域)包含一个枚举对象和型号。显示名称正确显示和工作的EnumDropdownList但由于某种原因没有为DisplayFor帮手,所有显示的是实际的枚举名称。
不知道我错过了什么,asp.net MVC 5.1添加了对这个,所以我不应该需要创建自己的helper方法显示名称支持。参见:<一href=\"https://aspnet.$c$cplex.com/SourceControl/latest#Samples/MVC/EnumSample/EnumSample/Models/Enums.cs\">https://aspnet.$c$cplex.com/SourceControl/latest#Samples/MVC/EnumSample/EnumSample/Models/Enums.cs
公共类插件
{
公众诠释标识{搞定;组; }
公共AddonType AddonType {搞定;组; }
公共字符串名称{;组; }
公共十进制价格{搞定;组; }
公共布尔IsActive {搞定;组; }
}公共枚举AddonType:字节
{
[显示(NAME =蛋糕主题)]
CakeTheme,
[显示(NAME =蛋糕味)]
CakeFlavour,
[显示(NAME =蛋糕结冰)]
CupcakeIcing,
[显示(NAME =党插件)]
加上
}
MODEL
公共类AddonModel
{
公众诠释标识{搞定;组; }
公共AddonType AddonType {搞定;组; }
公共字符串名称{;组; }
公共十进制价格{搞定;组; }
公众诠释数量{搞定;组; }
公共布尔IsActive {搞定;组; }
}
查看
&LT; H2&GT;指数&LT; / H&GT;&所述p为H.;
@ Html.ActionLink(新建,创建)
&所述; / P&GT;
&LT;表类=表&GT;
&所述; TR&GT;
&LT;第i个类型&lt; /第i
&LT;第i个姓名和LT; /第i
百分位&GT;&LT; /第i
&LT; / TR&GT;@foreach(以型号VAR项){
&所述; TR&GT;
&所述; TD&GT;
@ Html.DisplayFor(型号=&GT; item.AddonType)
&LT; / TD&GT;
&所述; TD&GT;
@ Html.DisplayFor(型号=&GT; item.Name)
&LT; / TD&GT;
&所述; TD&GT;
@ Html.DisplayFor(型号=&GT; item.Price)
&LT; / TD&GT;
&所述; TD&GT;
@ Html.ActionLink(编辑,编辑,新{ID = item.Id})|
@ Html.ActionLink(详细信息,详细信息,新{ID = item.Id})|
@ Html.ActionLink(删除,删除,新{ID = item.Id})
&LT; / TD&GT;
&LT; / TR&GT;
}&LT; /表&gt;
创建新的文件夹查看/共享/ DisplayTemplates
添加一个名为枚举空的局部视图,文件夹
替换为枚举查看code:
@model枚举@if(EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata))
{
//使用相同的名字显示枚举(从[显示]属性)在编辑器
字符串显示名= NULL;
的foreach(在EnumHelper.GetSelectList(ViewData.ModelMetadata SelectListItem项目,(枚举)型号))
{
如果(item.Selected)
{
显示名= item.Text? item.Value;
}
}//处理,没有什么选择了意想不到的情况下,
如果(String.IsNullOrEmpty(显示名))
{
如果(型号== NULL)
{
显示名=的String.Empty;
}
其他
{
显示名= Model.ToString();
}
}@ Html.DisplayTextFor(型号=&GT;显示名)
}
其他
{
//该枚举类型不被支持。回落到文本。
@ Html.DisplayTextFor(型号=&GT;模型)
}
下面是侯赛因的Shahriar 中的链接详细的文章
I have the following entity (domain) object and model that contain an enum. The display name appears correctly and works for a EnumDropdownList but for some reason not for the DisplayFor helper, all that is shown is the actual enum name.
Not sure what I am missing, asp.net MVC 5.1 added display name support for this so I shouldn't need to create my own helper methods. See: https://aspnet.codeplex.com/SourceControl/latest#Samples/MVC/EnumSample/EnumSample/Models/Enums.cs
public class Addon
{
public int Id { get; set; }
public AddonType AddonType { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public bool IsActive { get; set; }
}
public enum AddonType : byte
{
[Display(Name = "Cake Theme")]
CakeTheme,
[Display(Name = "Cake Flavour")]
CakeFlavour,
[Display(Name = "Cupcake Icing")]
CupcakeIcing,
[Display(Name = "Party Addon")]
AddOn
}
MODEL
public class AddonModel
{
public int Id { get; set; }
public AddonType AddonType { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int Quantity { get; set; }
public bool IsActive { get; set; }
}
VIEW
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>Type</th>
<th>Name</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(model => item.AddonType)
</td>
<td>
@Html.DisplayFor(model => item.Name)
</td>
<td>
@Html.DisplayFor(model => item.Price)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>
Create new folder Views/Shared/DisplayTemplates
Add empty Partial View named Enum, to the folder
Replace Enum View code with:
@model Enum
@if (EnumHelper.IsValidForEnumHelper(ViewData.ModelMetadata))
{
// Display Enum using same names (from [Display] attributes) as in editors
string displayName = null;
foreach (SelectListItem item in EnumHelper.GetSelectList(ViewData.ModelMetadata, (Enum)Model))
{
if (item.Selected)
{
displayName = item.Text ?? item.Value;
}
}
// Handle the unexpected case that nothing is selected
if (String.IsNullOrEmpty(displayName))
{
if (Model == null)
{
displayName = String.Empty;
}
else
{
displayName = Model.ToString();
}
}
@Html.DisplayTextFor(model => displayName)
}
else
{
// This Enum type is not supported. Fall back to the text.
@Html.DisplayTextFor(model => model)
}
Here is the link to detailed article by Shahriar Hossain
这篇关于MVC 5.1剃刀DisplayFor不枚举显示名称工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!