2017-01-29 6 views
0

Я работаю над проектом и для того, чтобы не менять внешний вид Layout при каждом изменении страницы, я решил изменить свои представления на частичные виды. Для того, чтобы загрузить точку, когда пользователь нажимает на одну из пунктов меню в меню навигации Я теперь с помощью JQuery Ajax, как следующее: -ASP.NET MVC Partial Views + Ajax Load

$("ul.metismenu a:not(.subMenuParent)").unbind().click(function (e) { 

    e.preventDefault(); 

    var url = $(this).attr("href"); 
    window.history.pushState("", "", url); 

    $.ajax({ 
     url: url, 
     dataType: 'html', 
     success: function (data) { 

      $('#page-content').html(data); 

     } 
    }); 
}); 

Элемент страницы-контента находится в режиме разметки. Он работает отлично, однако проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда я пытаюсь получить доступ к представлению, прямо скажите, что я go/Dashboard непосредственно в браузере, я получу только частичное представление без страницы макета. У кого-нибудь есть идеи, как я могу это решить? Заранее благодарю за любой совет.

+0

Просто добавьте '@ {Layout =" ~/Views/Shared/_Layout.cshtml "}' в ваш частичный вид. – mmushtaq

+0

@mmushtaq Я уже пробовал это, но макет был визуализирован дважды, а затем – krafo

+0

Можете ли вы поделиться, как действия контроллера, которые возвращают частичные виды? –

ответ

0

вашего URL вызов MVC Action, сделать ваше возвращение ActionResult: PartialView()

+0

мое действие возвращает ActionResult и уже возвращает PartialView() – krafo

+0

попробуйте добавить '@ {Layout = string.Empty; } ' –

+0

Или получается, что' jquery.unobtrusive-ajax.js' по умолчанию не включен. При добавлении его можно решить проблему. –

1

Вы можете иметь другую раскладку набор из различных действий контроллера, используя переменный. Даже ViewBag хватит. Для панели действий Action вы можете установить ViewBag.Layout (скажем) в HTML-файл Layout, а для частичного просмотра вы можете установить ViewBag.Layout на пустой. Используйте эту переменную на странице html. Таким образом, правильный макет будет поднят в зависимости от действия, которое мы вызываем.

+0

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

+0

Рад, что помогло! –

0

Я смог исправить проблему, сначала проверив, является ли запрос, являющийся запросом ajax, или нет. Затем, в зависимости от типа запроса, я устанавливаю представление «Макет». Это пример код из действия: -

public ActionResult Index() 
    { 
     if (!Request.IsAjaxRequest()) 
     { 
      ViewBag.Layout = "~/Views/Shared/_Layout.cshtml"; 
     } 
     return PartialView(); 
    } 

И в частичном виде я установить следующее: -

@{ 
     Layout = ViewBag.Layout; 
    } 

Надеется, что это поможет кому-то, кто может столкнуться с той же проблемой.