MVC DisplayTemplate - изменить вывод для заданного строкового значения

В настоящее время у меня есть представление, отображающее страницу для списка сущностей сотрудников. Значения, возвращаемые из базы данных для свойства Gender, представляют собой строковое значение "M" или "F" для соответствующего пола. Я хотел бы иметь возможность отображать строку «Мужской» или «Женский» в представлении из соответствующего значения свойства.

Я добавил следующую логику в Index.cshtml, который работает.

@foreach (var item in Model)
{
    <tr>
    //... various <td>'s
    @if (item.Gender == "M")
    {
        <td>Male</td>
    }
    else if (item.Gender == "F")
    {
        <td>Female</td>
    }
}

Я пытаюсь переместить это в шаблон отображения, но не могу заставить его работать.

Я добавил следующий код в Views\Shared\DisplayTemplates\Gender.cshtml:

@model System.String

@if (Model.Gender == "M")
{
    <td>Male</td>
}
else if (Model.Gender == "F")
{
    <td>Female</td>
}

Каков наилучший способ заставить это работать?


person James P    schedule 04.07.2014    source источник
comment
Привет, насколько мне известно, шаблоны отображения и редактора работают для примитивных типов. например. если вы переименуете свое представление из Gender.cshtml в String.cshtml, оно сработает. Но это не будет работать с непримитивными типами. Я давно написал статью здесь codeproject.com/Articles/672591/   -  person Anupam Singh    schedule 05.07.2014


Ответы (2)


Вы можете добавить частичное представление и вызвать его так в основном представлении:

@foreach (var item in Model)
{
    // other tds here

    @Html.Partial("_Gender",item.Gender)
}

Создайте частичное представление с именем _Gender в папке Просмотр >> Общий:

@model String

@{

Layout = null;
}

    @if (Model== "M")
    {
        <td>Male</td>
    }
    else if (Model == "F")
    {
        <td>Female</td>
    }

    // or

   <td>@(Model == "M" ? "Male" : "Female") </td>

Он также может обрабатывать его в основном виде без создания частичного вида.

Он может обрабатывать это в главном представлении следующим образом:

@foreach (var item in Model)
{
    <tr>
    //... various <td>'s
    <td>@(item.Gender == "M" ? "Male" : "Female") </td>
    </tr>
}
person Ehsan Sajjad    schedule 04.07.2014
comment
Спасибо за быстрый ответ, но я надеялся, что это возможно с помощью DisplayTemplate? - person James P; 04.07.2014

Если вы хотите, чтобы он работал с шаблоном отображения, вам нужно сделать что-то вроде этого:

@foreach (var item in Model)
{
    @Html.DisplayFor(model => item.Gender)
}

и в модели представления прикрепите атрибут:

[UIHint("Gender")]
public string Gender { get; set; }

UIHint сообщает MVC, какой шаблон отображения использовать. В противном случае по соглашению MVC будет искать файл с именем String.chtml.

person Justin Ricketts    schedule 05.07.2014