c# - tutorial - asp.net mvc o que é




MVC 3: Como renderizar uma visualização sem sua página de layout quando carregada via ajax? (4)

Basta colocar o seguinte código no topo da página

@{
    Layout = "";
}

Estou aprendendo sobre aprimoramento progressivo e tenho uma pergunta sobre visualizações do AJAXifying. No meu projeto MVC 3, tenho uma página de layout, uma página de viewstart e duas visualizações simples.

A página de viewstart está na raiz da pasta Views e, portanto, se aplica a todas as views. Ele especifica que todas as visualizações devem usar _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 se renderizar à 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 em que posso pensar para fazer isso, mas eu particularmente não gosto de nenhuma delas:

1) Eu posso pegar todo o conteúdo do View e colocá-lo em uma visão parcial, então fazer com que o main view chame a visão parcial quando ele é renderizado. Dessa forma, usando Request.IsAjaxRequest() no controlador, posso retornar View() ou retornar PartialView() base no fato de a solicitação ser ou não uma solicitação Ajax. Não consigo retornar a visualização regular para a solicitação do Ajax porque ela usaria a página de layout e eu obteria uma segunda cópia da página de layout injetada. No entanto, eu não gosto disso porque me obriga a criar exibiçõ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();
    }

Então, em Index.cshtml faça isso:

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

2) Eu posso remover a designação de layout de _viewstart e especificá-lo manualmente quando a solicitação NÃO é 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 um pedido ajax, do que incluir explicitamente o layout se não for um ajax.


Crie dois layouts: 1. layout vazio, 2. layout principal e, em seguida, escreva no arquivo _viewStart este código:

@{
if (Request.IsAjaxRequest())
{
    Layout = "~/Areas/Dashboard/Views/Shared/_emptyLayout.cshtml";
}
else
{
    Layout = "~/Areas/Dashboard/Views/Shared/_Layout.cshtml";
}}

claro, talvez não seja a melhor solução


Eu prefiro e uso sua opção # 1. Eu não gosto de # 2 porque para mim View() implica que você está retornando uma página inteira. Deve ser uma página HTML totalmente desenvolvida e válida depois que o mecanismo de visualização for concluído. PartialView() foi criado para retornar partes arbitrárias de HTML.

Eu não acho que seja um grande negócio ter uma visão que apenas chame de parcial. Ainda é DRY e permite que você use a lógica da parcial em dois cenários.

Muitas pessoas não gostam de fragmentar os caminhos de chamada de suas ações com Request.IsAjaxRequest() , e eu posso entender isso. Mas IMO, se tudo o que você está fazendo é decidir se quer chamar View() ou PartialView() então o ramo não é um grande problema e é fácil de manter (e testar). Se você se encontrar usando IsAjaxRequest() para determinar grandes partes de como sua ação se desenrola, então fazer uma ação AJAX separada é provavelmente melhor.


Para um aplicativo Ruby on Rails, consegui impedir que um layout fosse carregado, especificando o render layout: false na ação do controlador que eu queria responder com ajax html.





razor