2011-12-15 6 views
4

У меня есть два представления MVC ... один для отображения деталей и один для редактирования значений. Они используют почти одинаковые шаблоны, за исключением того, что DisplayFor изменяется на EditorFor при переключении на просмотр редактора. Как я могу повторно использовать структуру базового макета в представлении, чтобы, если мне нужно изменить основной макет, мне нужно сделать это только в одном месте, а не в нескольких представлениях?Повторное использование MVC View для отображения данных и редактирования данных

Вот пример таблицы, используемый в целях отображения:

<table> 
    <tr> 
    <td class="label">First Name:</td> 
    <td class="field">@Html.DisplayFor(x => Model.FirstName)</td> 
    </tr> 
    <tr> 
    <td class="label">Last Name:</td> 
    <td class="field">@Html.DisplayFor(x => Model.LastName)</td> 
    </tr> 
    <tr> 
    <td class="label">Email:</td> 
    <td class="field">@Html.DisplayFor(x => Model.Email)</td> 
    </tr> 
</table> 
+0

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

ответ

3

Можно добавить свойство Mode в модели представления:

public bool IsInEditMode { get; set; } 

Затем контроллер может использовать один и тот же вид &, просто установите это свойство соответственно. Ваше мнение будет в конечном итоге, как:

<table> 
    <tr> 
    <td class="label">First Name:</td> 
    <td class="field"> 
     @if (!Model.IsInEditMode) 
     { 
      @Html.DisplayFor(x => Model.FirstName) 
     } 
     else 
     { 
      (render EditorFor plus any validation helpers) 
     } 
    </td> 
    </tr> 
    ...etc... 
</table> 
+0

Я надеялся на что-то более чистое (однострочный или какой-то метод обертки), но он действительно работает. Спасибо за информацию! – bigmac

1

Или вы можете использовать что-то очиститель для этой работы, как помощник Razor

public bool IsInEditMode { get; set; } 

@helper EditorFor(System.Linq.Expressions.Expression<Func<ViewModel, string>> exp) 
{ 
    @((Model.IsInEditMode) ? @Html.EditorFor(exp) : @Html.DisplayFor(exp)) 
} 
+0

Это было полезно и для другой ситуации. Я не комбинирую View и Edit, но в моем представлении Edit есть множество ограничений, основанных на статусе (в зависимости от статуса некоторые поля могут не редактироваться), это сработало хорошо. – Peter

0

имеет динамический вид, что проверяет идентификатор вашей организации. Бритва потрясающая! если 0 или null, это новый объект, иначе вы в режиме редактирования.

Razor Conditional!