Asp.net mvc 无法在剑道网格上显示枚举值

Asp.net mvc 无法在剑道网格上显示枚举值,asp.net-mvc,enums,kendo-ui,kendo-grid,kendo-asp.net-mvc,Asp.net Mvc,Enums,Kendo Ui,Kendo Grid,Kendo Asp.net Mvc,在我的MVC5应用程序中,我有一个如下所示的枚举类,通过这种方法,我可以传递枚举值,即US、UK而不是US“从控制器到视图。如何使用以下方法传递和显示枚举描述?我尝试了许多不同的解决方法,如,等等,但都没有解决我的问题。另一方面,我不想使用密封类,最好使用enum类的解决方案,如下所示: 枚举: public enum Country { [Description("United States")] US = 1, [Description("United Kingdo

在我的MVC5应用程序中,我有一个如下所示的枚举类,通过这种方法,我可以传递枚举值,即US、UK而不是US“从控制器到视图。如何使用以下方法传递和显示枚举描述?我尝试了许多不同的解决方法,如,等等,但都没有解决我的问题。另一方面,我不想使用密封类,最好使用enum类的解决方案,如下所示:


枚举:

public enum Country
{
    [Description("United States")]
    US = 1,
    [Description("United Kingdom")]
    UK = 2,
    [Description("New Zealand")]
    NewZealand = 3,
    [Description("France")]
    France = 4,
    [Description("Germany")]
    Germany = 5
}
public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public Country Country { get ; set; }
    //code omitted for brevity
}
public JsonResult Visitor_Read([DataSourceRequest] DataSourceRequest request)
{
    var result = db.Visitors.Select(m => new VisitorViewModel
    {
        VisitorID = m.VisitorID,
        Country = m.Country
        //code omitted for brevity
    })      
    var jsonResult = Json(result, JsonRequestBehavior.AllowGet);
    jsonResult.MaxJsonLength = int.MaxValue;
    return jsonResult;
}
$(document).ready(function () {

    var grid = $("#visitorGrid").kendoGrid({            
        dataSource: {
            type: "json",
            transport: {
                read: {
                    url: "/Visitor/Visitor_Read",
                    dataType: "json",
                    cache: false
                }
            },
            schema: {
                model: {
                    fields: {
                        VisitorID: { type: 'number' },
                        Country : { type: 'string' }
                    }
                }
            }
        },
        columns:
        [   
            { field: "VisitorID", title: "Id" },
            { field: "Country ", title: "Country" }, 
        ]
    }).data("kendoGrid");   

});

型号:

public enum Country
{
    [Description("United States")]
    US = 1,
    [Description("United Kingdom")]
    UK = 2,
    [Description("New Zealand")]
    NewZealand = 3,
    [Description("France")]
    France = 4,
    [Description("Germany")]
    Germany = 5
}
public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public Country Country { get ; set; }
    //code omitted for brevity
}
public JsonResult Visitor_Read([DataSourceRequest] DataSourceRequest request)
{
    var result = db.Visitors.Select(m => new VisitorViewModel
    {
        VisitorID = m.VisitorID,
        Country = m.Country
        //code omitted for brevity
    })      
    var jsonResult = Json(result, JsonRequestBehavior.AllowGet);
    jsonResult.MaxJsonLength = int.MaxValue;
    return jsonResult;
}
$(document).ready(function () {

    var grid = $("#visitorGrid").kendoGrid({            
        dataSource: {
            type: "json",
            transport: {
                read: {
                    url: "/Visitor/Visitor_Read",
                    dataType: "json",
                    cache: false
                }
            },
            schema: {
                model: {
                    fields: {
                        VisitorID: { type: 'number' },
                        Country : { type: 'string' }
                    }
                }
            }
        },
        columns:
        [   
            { field: "VisitorID", title: "Id" },
            { field: "Country ", title: "Country" }, 
        ]
    }).data("kendoGrid");   

});

控制器:

public enum Country
{
    [Description("United States")]
    US = 1,
    [Description("United Kingdom")]
    UK = 2,
    [Description("New Zealand")]
    NewZealand = 3,
    [Description("France")]
    France = 4,
    [Description("Germany")]
    Germany = 5
}
public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public Country Country { get ; set; }
    //code omitted for brevity
}
public JsonResult Visitor_Read([DataSourceRequest] DataSourceRequest request)
{
    var result = db.Visitors.Select(m => new VisitorViewModel
    {
        VisitorID = m.VisitorID,
        Country = m.Country
        //code omitted for brevity
    })      
    var jsonResult = Json(result, JsonRequestBehavior.AllowGet);
    jsonResult.MaxJsonLength = int.MaxValue;
    return jsonResult;
}
$(document).ready(function () {

    var grid = $("#visitorGrid").kendoGrid({            
        dataSource: {
            type: "json",
            transport: {
                read: {
                    url: "/Visitor/Visitor_Read",
                    dataType: "json",
                    cache: false
                }
            },
            schema: {
                model: {
                    fields: {
                        VisitorID: { type: 'number' },
                        Country : { type: 'string' }
                    }
                }
            }
        },
        columns:
        [   
            { field: "VisitorID", title: "Id" },
            { field: "Country ", title: "Country" }, 
        ]
    }).data("kendoGrid");   

});

查看:

public enum Country
{
    [Description("United States")]
    US = 1,
    [Description("United Kingdom")]
    UK = 2,
    [Description("New Zealand")]
    NewZealand = 3,
    [Description("France")]
    France = 4,
    [Description("Germany")]
    Germany = 5
}
public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public Country Country { get ; set; }
    //code omitted for brevity
}
public JsonResult Visitor_Read([DataSourceRequest] DataSourceRequest request)
{
    var result = db.Visitors.Select(m => new VisitorViewModel
    {
        VisitorID = m.VisitorID,
        Country = m.Country
        //code omitted for brevity
    })      
    var jsonResult = Json(result, JsonRequestBehavior.AllowGet);
    jsonResult.MaxJsonLength = int.MaxValue;
    return jsonResult;
}
$(document).ready(function () {

    var grid = $("#visitorGrid").kendoGrid({            
        dataSource: {
            type: "json",
            transport: {
                read: {
                    url: "/Visitor/Visitor_Read",
                    dataType: "json",
                    cache: false
                }
            },
            schema: {
                model: {
                    fields: {
                        VisitorID: { type: 'number' },
                        Country : { type: 'string' }
                    }
                }
            }
        },
        columns:
        [   
            { field: "VisitorID", title: "Id" },
            { field: "Country ", title: "Country" }, 
        ]
    }).data("kendoGrid");   

});

您必须创建将返回description属性的方法。它可以是一些辅助方法、扩展或任何你想要的东西

例如:

public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public Country Country { get ; set; }
    //code omitted for brevity

    public  string GetDescription()
    {
        var type = typeof(Country);
        var memInfo = type.GetMember(this.Country.ToString());
        var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        return ((DescriptionAttribute)attributes[0]).Description;
    }
}
所以你可以这样称呼它

var result = db.Visitors.Select(m => new VisitorViewModel
{
    VisitorID = m.VisitorID,
    Country = m.GetDescription()
    //code omitted for brevity
})  
或者,如果它更适合您,请创建将被类似地调用但将是静态的helper方法

public class SomeHelperClass
{
    public static string GetDescription(VisitorViewModel model)
    {
        var type = typeof(Country);
        var memInfo = type.GetMember(model.Country.ToString());
        var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        return ((DescriptionAttribute)attributes[0]).Description;
    }
}
所以这个电话看起来像

SomeHelperClass.GetDescription(model);

编辑 我有一个想法,也许这不是你想要的,也许它可以帮助你。 如果添加具有国家名称的属性,也可以使用此方法:

public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public string CountryName { get; set; }

    private Country _country;
    public Country Country 
    { 
        get { return this._country; }
        set
        {
            this._country = value;
            this.CountryName = GetDescription(value);
        }
    }
    //code omitted for brevity

    private string GetDescription(Country country)
    {
        var type = typeof(Country);
        var memInfo = type.GetMember(country.ToString());
        var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        return ((DescriptionAttribute)attributes[0]).Description;
    }
}
所以如果你能像你一样填充你的模型

var result = db.Visitors.Select(m => new VisitorViewModel
{
    VisitorID = m.VisitorID,
    Country = m.Country
    //code omitted for brevity
})    
您将自动填写可以在剑道网格中使用的CountryName属性

{ field: "CountryName", title: "Country" }, 

您必须创建将返回description属性的方法。它可以是一些辅助方法、扩展或任何你想要的东西

例如:

public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public Country Country { get ; set; }
    //code omitted for brevity

    public  string GetDescription()
    {
        var type = typeof(Country);
        var memInfo = type.GetMember(this.Country.ToString());
        var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        return ((DescriptionAttribute)attributes[0]).Description;
    }
}
所以你可以这样称呼它

var result = db.Visitors.Select(m => new VisitorViewModel
{
    VisitorID = m.VisitorID,
    Country = m.GetDescription()
    //code omitted for brevity
})  
或者,如果它更适合您,请创建将被类似地调用但将是静态的helper方法

public class SomeHelperClass
{
    public static string GetDescription(VisitorViewModel model)
    {
        var type = typeof(Country);
        var memInfo = type.GetMember(model.Country.ToString());
        var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        return ((DescriptionAttribute)attributes[0]).Description;
    }
}
所以这个电话看起来像

SomeHelperClass.GetDescription(model);

编辑 我有一个想法,也许这不是你想要的,也许它可以帮助你。 如果添加具有国家名称的属性,也可以使用此方法:

public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public string CountryName { get; set; }

    private Country _country;
    public Country Country 
    { 
        get { return this._country; }
        set
        {
            this._country = value;
            this.CountryName = GetDescription(value);
        }
    }
    //code omitted for brevity

    private string GetDescription(Country country)
    {
        var type = typeof(Country);
        var memInfo = type.GetMember(country.ToString());
        var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        return ((DescriptionAttribute)attributes[0]).Description;
    }
}
所以如果你能像你一样填充你的模型

var result = db.Visitors.Select(m => new VisitorViewModel
{
    VisitorID = m.VisitorID,
    Country = m.Country
    //code omitted for brevity
})    
您将自动填写可以在剑道网格中使用的CountryName属性

{ field: "CountryName", title: "Country" }, 

您必须为自定义属性设置
NotMapped
属性:

using System.ComponentModel.DataAnnotations.Schema;
public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public Country Country { get; set; }

    [NotMapped]
    public string CountryName
    {
        get { return Country.GetDescription(); }
    }
}
下一个扩展方法是
GetDescription()

public static string GetDescription(this Enum e)
{
    var field = e.ToString();
    var attribute = e.GetType().GetField(field).GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault();

    return attribute != null ? ((DescriptionAttribute)attribute).Description : field;
}

您必须为自定义属性设置
NotMapped
属性:

using System.ComponentModel.DataAnnotations.Schema;
public class VisitorViewModel
{
    [Key]
    public int VisitorID { get; set; }

    public Country Country { get; set; }

    [NotMapped]
    public string CountryName
    {
        get { return Country.GetDescription(); }
    }
}
下一个扩展方法是
GetDescription()

public static string GetDescription(this Enum e)
{
    var field = e.ToString();
    var attribute = e.GetType().GetField(field).GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault();

    return attribute != null ? ((DescriptionAttribute)attribute).Description : field;
}

如果您使用的是asp.net MVC,为什么不使用razor来创建网格呢?您可以添加额外的getter
公共字符串CountryName
,它返回
Country.ToString()
@ataravati I use razor(查看页面为cshtml)。如果你指的是剑道MVC,我以前就习惯了,但在这个项目中,出于某种原因,我不得不在javascript中使用剑道网格。另一方面,解决这个问题有意义吗?因为首先我需要从控制器返回由多个单词组成的字符串值到视图。至少知道吗?@GeneR,但我使用EF-Code-First方法,我不确定向相关实体类添加新属性是否会导致数据库中出现额外的列。我应该把它当作虚拟的吗?您可以通过更改我的原始代码来发布一个示例吗?@Christof我正在首先使用EF反向工程代码,为模型生成
部分类
,然后为模型自定义属性创建相同的
部分类
。您为什么不使用razor来创建网格,如果您使用的是asp.net MVC?您可以添加额外的getter
公共字符串CountryName
,该字符串返回
Country.ToString()
@ataravati I use razor(查看页面为cshtml)。如果你指的是剑道MVC,我以前就习惯了,但在这个项目中,出于某种原因,我不得不在javascript中使用剑道网格。另一方面,解决这个问题有意义吗?因为首先我需要从控制器返回由多个单词组成的字符串值到视图。至少知道吗?@GeneR,但我使用EF-Code-First方法,我不确定向相关实体类添加新属性是否会导致数据库中出现额外的列。我应该把它当作虚拟的吗?您可以通过更改我的原始代码来发布一个示例吗?@Christof我正在首先使用EF反向工程代码,为模型生成
部分类
,然后为模型自定义属性创建相同的
部分类
。谢谢您的回复。我尝试了第一个和第二个方法,但得到了以下错误:对于第一个方法,我得到“LINQ to Entities无法识别方法'System.String GetDescription()'方法,并且此方法无法转换为存储表达式。”我查看了解决方法,但没有解决问题。对于第二个问题,我得到“自数据库创建以来,支持“DbContext”上下文的模型已更改。”错误。我知道这不是一个错误,但表明迁移和更新数据库将导致数据库中出现我不需要的额外冒号(CountryName)。@Christof您可以对CountryName列使用NotMapped属性。我已经忘了。非常感谢阿德玛,但由于吉恩之前发布了带有“NotMapping”的工作代码,我选择了他的答案。当然,你的答案是肯定的。再次非常感谢:)非常感谢你的回复。我尝试了第一个和第二个方法,但得到了以下错误:对于第一个方法,我得到“LINQ to Entities无法识别方法'System.String GetDescription()'方法,并且此方法无法转换为存储表达式。”我查看了解决方法,但没有解决问题。对于第二个问题,我得到“自数据库创建以来,支持“DbContext”上下文的模型已更改。”错误。我知道这不是一个错误,但表明迁移和更新数据库将导致数据库中出现我不需要的额外冒号(CountryName)。@Christof您可以对CountryName列使用NotMapped属性。我已经忘了。非常感谢阿德玛,但由于吉恩之前发布了带有“NotMapping”的工作代码,我选择了他的答案。当然,你的答案是肯定的。再次非常感谢:)完美且非常简单。。。非常感谢Gene,现在它就像一个魅力:)投票+完美和非常简单。。。非常感谢Gene,现在它像