MVC 5.1剃刀DisplayFor不枚举显示名称工作 [英] MVC 5.1 Razor DisplayFor not working with Enum DisplayName

查看:578
本文介绍了MVC 5.1剃刀DisplayFor不枚举显示名称工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下的实体(域)包含一个枚举对象和型号。显示名称正确显示和工作的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆