2016-03-08 2 views
2

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

namespace ProjectManager.Models 
{ 
    public class Contract 
    { 
     ..... 
     public enum ContractStatus 
     { 
      [System.ComponentModel.Description("جديد")] 
      New, 
      [System.ComponentModel.Description("در انتظار پرداخت")] 
      WaitForPayment, 
      [System.ComponentModel.Description("پرداخت شده")] 
      Paid, 
      [System.ComponentModel.Description("خاتمه يافته")] 
      Finished 
     }; 

     public ContractStatus Status { get; set; } 
     ..... 
    } 

} 

Внутри моих взглядов бритвы, я хочу, чтобы отобразить описание перечислений для каждого элемента, например, جديد вместо New. Я пытался следовать инструкциям в this answer, но я не знаю, где добавить метод расширения и как вызвать метод расширения внутри моего файла просмотра бритвы. Я был бы благодарен, если кто-то может выполнить мой код:

@model IEnumerable<ProjectManager.Models.Contract> 
.... 
<table class="table"> 
    <tr> 
     ..... 
     <th>@Html.DisplayNameFor(model => model.Status)</th> 
     ..... 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     ...... 
     <td> 
      @Html.DisplayFor(modelItem => item.Status) //<---what should i write here? 
     </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> 
} 

+0

Вы можете поместить метод расширения в любом месте (в вашей текущей сборке или другой сборке или отдельной dll). И вы просто используете его как ' @ item.Status.DisplayName()' (и включают в себя необходимый оператор 'using', который указывает на сборку. –

+0

@StephenMuecke Я добавил метод DisplayName в открытый статический класс' Utils', который делает метод, доступный как «Utils.DisplayName» внутри моего проекта после добавления 'using ProjectManager.App_Start;' однако он не разрешен в '@ item.Status.DisplayName()'. Что мне теперь делать? – VSB

+0

Какие ошибки вы получаете? –

ответ

7

Вы можете поместить метод расширения в любом месте. Например, в текущем проекте, добавьте папку (скажем) Extensions, а затем добавить статический класс

namespace yourProject.Extensions 
{ 
    public static class EnumExtensions 
    { 
     public static string DisplayName(this Enum value) 
     { 
      // the following is my variation on the extension method you linked to 
      if (value == null) 
      { 
       return null; 
      } 
      FieldInfo field = value.GetType().GetField(value.ToString()); 
      DescriptionAttribute[] attributes = (DescriptionAttribute[])field 
       .GetCustomAttributes(typeof(DescriptionAttribute), false); 
      if (attributes.Length > 0) 
      { 
       return attributes[0].Description; 
      } 
      return value.ToString(); 
     } 
    } 
} 

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

Затем включают в себя @using yourProject.Extensions; заявление в представлении и использовать его в качестве

<td>@item.Status.DisplayName()</td> 

Заметим также, что, чтобы избежать using заявления в представлении, вы можете добавить сборку в файл web.config.cs

<system.web> 
    .... 
    <pages> 
     <namespaces> 
      <add namespace="System.Web.Helpers" /> 
      <add namespace="yourProject.Extensions" /> 
Смежные вопросы