Estou aprendendo sobre o aprimoramento progressivo e tenho uma pergunta sobre os modos de exibição AJAXifying. No meu projeto MVC 3, tenho uma página de layout, uma página de início de exibição e duas visualizações simples.
A página de início de exibição está na raiz da pasta Exibições e, portanto, se aplica a todas as exibições. Ele especifica que todas as visualizações devem ser usadas _Layout.cshtml
para sua página de layout. A página de layout contém dois links de navegação, um para cada visualização. Os links usam @Html.ActionLink()
para renderizar-se na página.
Agora eu adicionei o jQuery e quero seqüestrar esses links e usar o Ajax para carregar seu conteúdo na página dinamicamente.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Existem duas maneiras de pensar nisso, mas não gosto particularmente de nenhuma delas:
1) Posso pegar todo o conteúdo da Visualização e colocá-los em uma visualização parcial, e depois a visualização principal chama a visualização parcial quando é renderizada. Dessa forma, usando Request.IsAjaxRequest()
no controlador, eu posso retornar View()
ou retornar com PartialView()
base no fato de a solicitação ser ou não Ajax. Não posso retornar a exibição regular à solicitação do Ajax porque ela usaria a página de layout e eu receberia uma segunda cópia da página de layout. No entanto, não gosto disso porque me obriga a criar visualizações vazias com apenas um @{Html.RenderPartial();}
nelas para as solicitações GET padrão.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Em Index.cshtml, faça o seguinte:
@{Html.RenderPartial("partialView");}
2) Posso remover a designação de layout de _viewstart e especificá-la manualmente quando a solicitação NÃO for Ajax:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
Alguém tem uma sugestão melhor? Existe uma maneira de retornar uma exibição sem sua página de layout? Seria muito mais fácil dizer explicitamente "não inclua seu layout" se for uma solicitação ajax, do que incluir explicitamente o layout se não for um ajax.