2015-12-15 2 views
1

В моем приложении MVC5 у меня есть класс перечисления, как показано ниже, и с этим подходом я могу передать значения enum, а именно US, UK вместо United States "from Controller to View. и отображать перечисление с помощью следующего подхода? Я пробовал много разных методов решения как C# String enums и т. д., но ни одна из них не решила мою проблему. С другой стороны, я не хочу использовать закрытый класс, и для меня было бы лучше решение с классом перечисления, как показано ниже:Невозможно отобразить значения перечисления в сетке Кендо


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"); 

}); 
+0

Почему бы вам не использовать бритву, чтобы создать сетку, если вы 'using asp.net MVC? – ataravati

+0

Вы можете добавить дополнительную getter 'public string CountryName', которые возвращают' Country.ToString() ' –

+0

@ataravati Я использую бритву (страница просмотра - cshtml). Если вы имеете в виду Kendo MVC, я использовал это раньше, но в этом проекте мне почему-то пришлось использовать Kendo Grid в javascript. С другой стороны, имеет ли смысл решать эту проблему? Потому что в первую очередь мне нужно вернуть строковые значения, состоящие из нескольких слов из Controller to View. Есть хоть идея об этом? –

ответ

3

Вы должны установить 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; 
} 
+0

Идеально и очень просто ... Спасибо большое Джин, теперь он работает как шарм :) Проголосовали + –

1

Вам нужно будет создать метод, который вернет атрибут описания. Это может быть какой-то вспомогательный метод, расширение или что угодно.

Например:

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 
}) 

Или, если это будет лучше для вас, создать вспомогательный метод, который будет называться так же, но будет статическим .. .

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); 

EDIT меня одна идея, может быть, это не совсем то, что вы хотите, может быть, это может помочь вам. Если добавить свойство с именем страны вы можете использовать этот подход также:

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 whcih может быть использовать в сетке кендо.

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

Большое спасибо за ваш ответ. Я попробовал первый и второй методы, но получил следующую ошибку: для первого метода я получаю: «LINQ to Entities не распознает метод« System.String GetDescription() », и этот метод не может быть переведен в выражение хранилища». Я смотрю на обходное решение, но не решил проблему. Для второго я получаю «Модель, поддерживающая контекст« DbContext », изменилась с момента создания базы данных». ошибка. Я знаю, что это не ошибка, но указывает, что миграция и обновление базы данных вызовет дополнительный двоеточие (CountryName) в базе данных, которую я не хочу. –

+0

@Christof вы можете использовать атрибут NotMapped для столбца CountryName. [link] (http://www.entityframeworktutorial.net/code-first/notmapped-dataannotations-attribute-in-code-first.aspx) Я забыл об этом. – Ademar

+0

Большое спасибо Ademar, но поскольку Gene опубликовал рабочий код с «NotMapped» раньше, я выбрал его ответ. Но, конечно, проголосовал + ваш ответ. Спасибо много раз :) –

Смежные вопросы