2016-03-09 3 views
1

Я новичок в MVC, так что прошу прощения, если мои вопросы натолкнутся на такие глупости.Вложенные макеты MVC5

У меня есть основной файл макета (_MainLayout.cshtml) и дополнительный файл макета (_AdminLayout.cshtml). Оба этих файла находятся в папке/Views/Shared.

_MainLayout.cshtml выглядит следующим образом:

<!DOCTYPE html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
    <link rel="shortcut icon" type="image/x-icon" href="~/icons/favicon.ico" /> 
    <title>U - @ViewData["Title"]</title> 
    <link rel="stylesheet" href="~/Content/Site.css"/> 
</head> 
<body> 
    <nav> 
     <div id="MainMenu" style="top:45px; height:40px; width:100%; position:fixed"> 
      <ul style="list-style-type:none; text-align:center"> 
       <li class="u-li-rightfloatinglink">@Html.ActionLink("Admin", "_AdminLayout", "Admin")</li> 
       <li class="u-li-rightfloatinglink">@Html.ActionLink("Contact", "Contact", "Home")</li> 
       <li class="u-li-rightfloatinglink">@Html.ActionLink("About", "About", "Home")</li> 
       <li class="u-li-rightfloatinglink">@Html.ActionLink("Home", "Index", "Home")</li> 
      </ul> 
     </div> 
    </nav> 
    <div id="MainBody" style="top: 80px; width:100%; text-align:center; position:fixed"> 
     @RenderBody() 
    </div> 
    <div id="MainFooter" style="position:fixed; bottom:0px; width:100%; height:20px; background:#015da0"> 
     <p style="display:table-cell; color:#ffffff; text-align:center; vertical-align: middle">&copy; @DateTime.Now.Year - U</p> 
    </div> 
    @RenderSection("scripts", required: false) 
</body> 

_AdminLayout.cshtml выглядит следующим образом:

@{ 
    ViewBag.Title = "_AdminLayout"; 
    Layout = "~/Views/Shared/_MainLayout.cshtml"; 
} 

<h2>_AdminLayout</h2> 
<div> 
    @RenderBody() 
</div> 

ManageTableContent.cshtml снова должен отображаться в разделе @RenderBody в _AdminLayout .cshtml.

ManageTableContent.cshtml выглядит следующим образом:

@{ 
    Layout = "~/Views/Shared/_AdminLayout.cshtml"; 
    ViewBag.Title = "Manage Table Content"; 
} 
<body> 
    <div class="u-div-header"> 
     <p class="u-p-header">Manage Table Content</p> 
    </div> 
    <br /> 
    <div style="width: 100%"> 
     <table class="u-table-layouttable"> 
      <tr> 
       <td class="u-td-description">Table Name here</td> 
       <td class="u-td-buttons"> 
        <button class="u-button-addrecord" title="Add Record"> 
         <img /> 
        </button> 
        <button class="u-button-deleterecord" title="Delete Record"> 
         <img /> 
        </button> 
        <button class="u-button-clonerecord" title="Clone Record"> 
         <img /> 
        </button> 
      </tr> 
      <tr> 
       <td colspan="2"> 
        <table id="ManagedTable" class="u-table-datatable"> 
         <tr class="u-tr-datatable"> 
          <td></td> 
         </tr> 
        </table> 
       </td> 
      </tr> 
     </table> 
     <table style="width: 100%"> 
      <tr> 
       <td> 
        <input id="Submit" type="submit" value="Submit" style="float: right" /> 
        <input id="Cancel" type="reset" value="Cancel" style="float: right" /> 
       </td> 
      </tr> 
     </table> 
    </div> 
</body> 

По какой-то причине, если я получаю эту ошибку, когда я пытаюсь открыть мой _AdminLayout.cshtml, выбрав ссылку администратора из моего _MainLayout.cshtml:

Additional information: The file "~/Views/Shared/_AdminLayout.cshtml" cannot be requested directly because it calls the "RenderBody" method. 

Controller Код:

namespace U.Controllers 
{ 
    public class AdminController : Controller 
    { 
     // GET: Admin 
     public ActionResult ManageTableContent() 
     { 
      return View(); 
     } 
     public ActionResult _AdminLayout() 
     { 
      ViewBag.Message = "Your admin page."; 

      return View(); 
     } 
    } 
} 

Если удалить @RenderBody() из моего кода, тогда _AdminLayout.cshtml загружается отлично. Мне нужен @RenderBody() в моем _AdminLayout.cshtml, потому что здесь я снова покажу частичные представления.

Любая помощь будет оценена по достоинству.

+0

Я получаю эту ошибку, когда я пытаюсь открыть свой _AdminLayout.cshtml из моего _MainLayout.cshtml - проясните более четко –

+0

На моем _MainLayout.cshtml У меня есть несколько ссылок. Одна из ссылок, в свою очередь, вызовет/откроет/отобразит _AdminLayout.cshtml в разделе @RenderBody() в _MainLayout.cshtml. –

+0

Я действительно не понимаю. Я не знаю, в чем проблема обмена кодом с нами. Из вашего высказывания вы вызываете _MainLayout из _Adminlayout и _AdminLayout из _MainLayout. Это своего рода рекурсивный. Если вы любезно поделитесь своим кодом, то, возможно, люди могут вам помочь. –

ответ

1

У вас может быть только один @RenderBody() для макета главного устройства (это то, к чему идет вывод представления).

Если _AdminLayout.cshtml не является макетом макета, тогда вы должны использовать @RenderPartial для вставки в него частичных представлений.

+0

Как узнать, является ли макет макетом макета? –

1

Основываясь на ваш комментарий, при вызове _AdminLayout действие затем вызывает автоматически _AdminLayout.cshtml и как это имеет метод @RenderBody() в его просмотра файла он получить сообщение об ошибке. Просмотр контроллера действия не может содержать @RenderBody().

Вы можете сделать таким образом. Измените имя пользователя ActionResult _AdminLayout на AdminLayout.

И создайте еще один файл вида с именем AdminLayout.cshtml.

И в этом cshtml вы можете запрограммировать этот путь.

@{ 
    Layout = "~/Views/Shared/_AdminLayout.cshtml"; 
    ViewBag.Title = "Manage Table Content"; 
} 

Надеюсь, вы понимаете, почему вы получаете эту ошибку.

+0

Аник, извините, я просто не могу обмотать голову вокруг этого. –

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