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.
Layout = ViewBag.LayoutFile
.Basta colocar o seguinte código no topo da página
fonte
Eu prefiro e uso sua opção nº 1. Não gosto do número 2 porque para mim
View()
implica que você está retornando uma página inteira. Deverá ser uma página HTML válida e completa, assim que o mecanismo de exibição estiver pronto.PartialView()
foi criado para retornar pedaços arbitrários de HTML.Não acho muito importante ter uma visão que apenas chame de parcial. Ainda está SECO e permite que você use a lógica do parcial em dois cenários.
Muitas pessoas não gostam de fragmentar os caminhos de chamada de suas ações
Request.IsAjaxRequest()
, e eu posso apreciar isso. Mas a IMO, se tudo o que você está fazendo é decidir se deseja ligarView()
ou nãoPartialView()
, o ramo não é grande coisa e é fácil de manter (e testar). Se você se encontra usandoIsAjaxRequest()
para determinar grandes partes de como sua ação é executada, é provável que fazer uma ação AJAX separada seja melhor.fonte
Crie dois layouts: 1. layout vazio, 2. layout principal e, em seguida, escreva no arquivo _viewStart este código:
claro, talvez não seja a melhor solução
fonte
Você não precisa criar uma exibição vazia para isso.
No controlador:
retornar um PartialViewResult substituirá a definição de layout ao renderizar a resposta.
fonte
Com o ASP.NET 5, não há mais variável de solicitação disponível. Você pode acessá-lo agora com Context.Request
Além disso, não há mais o método IsAjaxRequest (), você deve escrevê-lo sozinho, por exemplo, em Extensions \ HttpRequestExtensions.cs
Eu procurei por um tempo agora sobre isso e espero que ajude alguns outros também;)
Recurso: https://github.com/aspnet/AspNetCore/issues/2729
fonte
Para um aplicativo Ruby on Rails, consegui impedir o carregamento de um layout especificando
render layout: false
na ação do controlador que eu queria responder com o ajax html.fonte