MVC 3: Как отрендерить представление без его страницы макета при загрузке через ajax?

Я изучаю Progressive Enhancement , и у меня есть вопрос об AJAXifying представлениях. В моем проекте MVC 3 у меня есть страница макета, страница начала просмотра и два простых представления.

Страница начала просмотра находится в корне папки представлений и, таким образом, применяется ко всем представлениям. Он указывает, что все представления должны использовать _Layout.cshtml для своей страницы макета. Страница макета содержит две навигационные ссылки, по одной для каждого представления. Ссылки используют @ Html.ActionLink () для отображения на странице.

Теперь я добавил jQuery и хочу перехватить эти ссылки и использовать Ajax для динамической загрузки их содержимого на страницу.


Я могу придумать два способа сделать это, но ни один мне не особо нравится :

1) Я могу взять все содержимое представления и поместить его в частичное представление, а затем заставить основное представление вызывать частичное представление при его рендеринге. Таким образом, используя Request.IsAjaxRequest () в контроллере, я могу вернуть View () или вернуть PartialView () в зависимости от того, является ли запрос запрос Ajax. Я не могу вернуть обычное представление в запрос Ajax, потому что тогда он будет использовать страницу макета, и я получу вторую копию страницы макета. Однако мне это не нравится, потому что это заставляет меня создавать пустые представления только с помощью @ {Html. RenderPartial ();} в них для стандартных запросов GET.

    public ActionResult Index()
    {
        if (Request.IsAjaxRequest())
            return PartialView("partialView");
        else
            return View();
    }

Затем в Index.cshtml сделайте следующее:

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

2) Я могу удалить обозначение макета из _viewstart и указать его вручную, если запрос НЕ Ajax :

    public ActionResult Index()
    {
        if (Request.IsAjaxRequest())
            return View(); // Return view with no master.
        else
            return View("Index", "_Layout"); // Return view with master.
    }

Есть ли у кого-нибудь предложения получше? Есть ли способ вернуть представление без страницы макета? Было бы намного проще явно сказать «не включать ваш макет», если это запрос ajax, чем явно включить макет, если это не ajax.

152
задан Chev 5 June 2014 в 15:54
поделиться