2015-07-14 2 views
0

Мне нужно отобразить меню в макете, используя частичный вид (если есть лучший подход, сообщите мне об этом). Я делаю это так (в макете):ASP.NET MVC Как использовать PartialView в макете?

@if (User.IsInRole("Admin")) 
    { 
     @Html.Partial("AdminMenu") 
    } 

И это, как я называю это в контроллере:

public ActionResult AdminMenu() 
    { 
     var am = _amr.GetAdminMenu(); 
     return PartialView(am); 
    } 

Так вот мой частичный вид:

@model IEnumerable<DigitalHubOnlineStore.ViewModels.AdminMenuViewModel> 

<div class="dropdown"> 
    <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"> 
     Admin menu 
     <span class="caret"></span> 
    </button> 
    <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> 
     @foreach (var item in Model) 
     { 
      <li><a href="@Html.DisplayFor(modelItem => item.MenuItemUrl)">@Html.DisplayFor(modelItem => item.MenuItemName)</a></li> 
     } 
    </ul> 
</div> 

К сожалению это не работает.

+0

Вы ожидаете модель 'IEnumerable ' в вашем парциальное пока вы не передавая ей что-нибудь? –

+0

Если я открываю частичный вид напрямую, это рендеринг. Но не в макете. –

+0

Вы хотите использовать '@ Html.RenderPartial (" AdminMenu ")' или '@ Html.RenderAction (" AdminMenu "," controller ")' –

ответ

3

Вам либо нужно вернуть коллекцию меню в родительском представлении, отправив соответствующую модель в Partial, либо сделать еще один вызов HtmlForm, AjaxForm или ajax из вашего частичного.

@Html.Partial("Partials/AdminMenu",Model.AdminMenuItems) 

ИЛИ

//SERVER 
    public ActionResult AdminMenu() 
    { 
     var am = _amr.GetAdminMenu(); 
     return Json(am,JsonBehaviour.AllowGet); 
    } 



    //CLIENT 
    @using (Ajax.BeginForm("AdminMenu","AdminController", null, 
     new AjaxOptions 
     { 
      OnSuccess = "renderSuccess", 
      OnFailure = "renderFailure", 
      OnBegin = "renderBegin" 
     }, 
     new 
     { 
      id = "frmViewerAdminMenu", 
      name = "frmViewerAdminMenu" 
     }) 
    ) 
    { 
    ... 

     <script type="text/javascript"> 
      function renderSuccess(ajaxContext){ 
       /// ajaxContext is whatever comes back from GetAdminMenu() 
      } 
     </script> 
    ... 
    } 

ИЛИ

--server Рендер Посмотреть

public ActionResult AdminMenuRenderView() 
{ 
    return Partial("AdminMenuPartial",GetAdminMenuItems()); 
} 

--partial AdminMenuViewDynamicLoader

@using (Ajax.BeginForm("AdminMenuRenderView","AdminController", null, 
    new AjaxOptions 
    { 
     OnSuccess = "renderSuccess", 
     OnFailure = "renderFailure", 
     OnBegin = "renderBegin" 
    }, 
    new 
    { 
     id = "frmViewerAdminMenu", 
     name = "frmViewerAdminMenu" 
    }) 
) 
{ 
... 
    <div id="divAdminMenuContent"></div> 

    <script type="text/javascript"> 
     function renderSuccess(ajaxContext){ 
      $('#divAdminMenuContent').html(ajaxContent); 
     } 
    </script> 
... 
} 

--partial AdminMenuPartial

@model IEnumerable<DigitalHubOnlineStore.ViewModels.AdminMenuViewModel> 

<div class="dropdown"> 
    <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"> 
     Admin menu 
     <span class="caret"></span> 
    </button> 
    <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> 
     @foreach (var item in Model) 
     { 
      <li><a href="@Html.DisplayFor(modelItem => item.MenuItemUrl)">@Html.DisplayFor(modelItem => item.MenuItemName)</a></li> 
     } 
    </ul> 
</div> 
+0

Ну, ни одно из этих решений не работает для меня, но да, вы правы, jQuery - это ответ. –

3

Вы должны использовать

@{Html.RenderPartial("Admin");} 

Html.Partial возвращает только вид в виде строки, она не записывает его в ответ, так просто звонит он ничего не делает, то возвращаемая строка выходит из области видимости. Причина этого заключается в том, что вы можете визуализировать частичное представление строки, а затем вставлять строку в несколько мест, не отринув частичное представление несколько раз. Например, если вы хотите, чтобы одна и та же разметка страниц находилась в верхней и нижней части страницы. Или, может быть, вы хотите, чтобы дублировать Частичный вид Tab, чтобы создать несколько вкладок, и т.д. и т.д. и т.п.

Чтобы получить текущий код, чтобы работать, попробуйте это

Model ...... 
@{ 
    Layout=..... 
    var adminMenu = Html.Partial("Admin"); 
} 
@if (User.IsInRole("Admin")) 
{ 
    Html.Raw(adminMenu); 
} 

Html.RenderPartial делает то же самое, но внутренне называет Напишите, чтобы написать ответ.

Теперь, если ваш Partial принимает модель, то вы должны дать ему метод контроллера,

[ChildActionOnly] 
public ActionResult AdminMenu(AdminMenuViewModel model) 
{ 
    return Partial(model); 
} 

Затем обновите ваш код вызывающего,

@{Html.RenderAction("AdminMenu", "ControllerHere", new { model = TheAdminViewModelHere });} 

Лично я pefer с помощью ChildOnlyAction для моих частично, потому что я могу переместить всю логику обработки в контроллер для частичного представления, которое работает лучше. Это также позволяет частичному представлению узнать о его родительском контексте, поскольку он дает вам доступ к контроллеру для добавления информации к модели для перехода к частичному представлению.

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