2016-02-01 6 views
1

У меня возникла проблема с настраиваемым шаблоном отображения в приложении MVC 5. У меня есть viewmodel, который содержит сложный тип, который я хотел бы использовать повторно. Я создал папку DisplayTemplates и разместил частичное представление, которое следует правильному правилу именования. Кажется, что все работает правильно, и частичное представление вызвано, но в браузере ничего не отображается.MVC DisplayFor Not Rendering

Я проверил вынесенный html, чтобы убедиться, что он не скрывается или отображается смешно, но буквально ничего не отображается в выходе html. См. Ниже соответствующие скриншоты. Что я делаю не так? Благодарю.

Структура папок

project structure

Вот первоначальный вид. В viewmodel есть список AvailableOption. Еогеасп называет Displayfor

@model CustomerWebPortal.ViewModels.OrderVehicle 
 

 
@using (Html.BeginForm("CreateOrder", "Home")) 
 
{ 
 
    <h2>@Html.DisplayFor(x => x.DisplayName)</h2> 
 

 
    <div class="description"> 
 
     <ul> 
 
      @Html.Raw(Model.Description) 
 
     </ul> 
 
    </div> 
 

 
    <h3>Available Options</h3> 
 
    <hr /> 
 

 
    <div> 
 
     @foreach (var option in Model.AvailableOptions) 
 
     { 
 
      Html.DisplayFor(x => option, "AvailableOption"); 
 
     } 
 
    </div> 
 

 
    <h3>Customer</h3> 
 
    <hr /> 
 
    
 
    <div class="customerInfo"> 
 
     @Html.LabelFor(x => x.Customer) 
 
     @Html.TextBoxFor(x => x.Customer) 
 
     @Html.ValidationMessageFor(x => x.Customer) 
 
    </div> 
 

 
    <div class="actions"> 
 
     <input type="submit" value="Place Order" /> 
 
    </div> 
 

 
    @Html.HiddenFor(x => x.VehicleId) 
 
    @Html.HiddenFor(x => x.Price) 
 
}

Вот частичный вид для комплексного типа

@model CustomerWebPortal.ViewModels.AvailableOption 
 

 
<div class="row-fluid padtopbottom5"> 
 
    <div class="span6"> 
 
     <div class="row-fluid"> 
 
      <div class="span4"> 
 
       @Html.CheckBoxFor(x => x.Selected) 
 
      </div> 
 
     </div> 
 
    </div> 
 

 
    <div class="span6"> 
 
     <div class="row-fluid"> 
 
      <div class="span4"> 
 
       <h3>@Html.DisplayFor(x => x.DisplayName)</h3> 
 

 
       <ul> 
 
        @Html.Raw(Model.Description) 
 
       </ul> 
 

 
       <p><strong>@Html.DisplayFor(x => x.Price)</strong></p> 
 
      </div> 
 
     </div> 
 
    </div> 
 
</div>

Вот это Еогеасп, который вызывает Displayfor для сложный тип

enter image description here

Вот Результирующие ОКАЗАННЫХ HTML

enter image description here

Я создал небольшой тестовый проект, который воспроизводит ошибку, если кто-то хочет посмотреть. Sample Project

+1

1) Какие виды вы показываете нам здесь? 2) Включили ли вы объявление '@model IEnumerable '? 3) Переместите папку в папку «Views/Shared/DisplayTemplates». – Jasen

+0

Является ли второе изображение контентом для вашего шаблона отображения? Кроме того, попробуйте опубликовать реальный код, чем изображения. – Shyju

+0

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

ответ

1

Это в комментариях к вопросу, но я написал небольшое тестовое приложение с использованием Html.Raw и, по-видимому, оно также должно исправить ваш случай. Он просто нуждается в "@" перед Html.DisplayFor

ViewModel (в моем случае, нежелательные данные для вас)

public class IndexViewModel 
{ 
    private IEnumerable<string> _avlOpt; 

    public IEnumerable<string> AvailableOptions 
    { 
     get { return _avlOpt; } 
     set { _avlOpt = value; } 
    } 

    public IndexViewModel() 
    { 
     List<string> lstString = new List<string>(); 
     for (int i=1;i<5;i++) 
     { 
      lstString.Add(@"<h" + i.ToString() + ">Test</h" + i.ToString() + ">"); 
     } 
     AvailableOptions = lstString; 
    } 
} 

Посмотреть

test<br/> 
@foreach (var option in Model.AvailableOptions) 
{ 
    @Html.Raw(option); 
} 
<br/>end test 

View Result (Источник - БЕЗ "@" - Html.Raw (опция))

<div> 
test<br/> 
<br/>end test 
</div> 

View Result (Источник - С "@" - @ Html.Raw (опция))

<div> 
test<br/> 
<h1>Test</h1><h2>Test</h2><h3>Test</h3><h4>Test</h4> <br/>end test 
</div> 
+0

Это тоже не сработало. Я считаю, что разница в том, что ваша коллекция представляет собой набор примитивных типов, а мои доступные варианты - сложный тип. Я создал тестовый проект, который воспроизводит ошибку. Ссылка находится в главном вопросе. Благодарю. –

+0

@ или используя raw? Я не говорю, чтобы использовать Raw. Я просто прошу вас поставить @ перед Html.DisplayFor. Я понимаю, что это в блоке кода. Просто попробуйте. Игнорировать исходное. Просто поставьте @ впереди и попробуйте. – Aaron

+0

Ах ... ты, сэр, прав. Странно, потому что я был уверен, что вам это не понадобится в блоке кода. В любом случае это фиксировало это. Спасибо за ваше время. –

0

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

В моем случае я экспериментировал с чем-то и отвлекся, оставив пустой файл в папке DisplayTemplates с именем string.cshtml и провел следующий час после возвращения, пытаясь понять, почему мои значения перестали отображаться.

Не делать