J'apprends à propos de Progressive Enhancement et j'ai une question sur les vues AJAXifying. Dans mon projet MVC 3, j'ai une page de mise en page, une page de démarrage et deux vues simples.
La page viewstart se trouve à la racine du dossier Views et s'applique donc à toutes les vues. Il spécifie que toutes les vues doivent être utilisées _Layout.cshtml
pour leur page de mise en page. La page de mise en page contient deux liens de navigation, un pour chaque vue. Les liens sont utilisés @Html.ActionLink()
pour s'afficher sur la page.
Maintenant, j'ai ajouté jQuery et je souhaite détourner ces liens et utiliser Ajax pour charger leur contenu sur la page de manière dynamique.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Il y a deux façons de le faire, mais je n'aime pas particulièrement l'une ou l'autre:
1) Je peux prendre tout le contenu de la vue et les placer dans une vue partielle, puis demander à la vue principale d'appeler la vue partielle lorsqu'elle est rendue. De cette façon, en utilisant Request.IsAjaxRequest()
dans le contrôleur, je peux retourner View()
ou retourner en PartialView()
fonction du fait que la demande est ou non une demande Ajax. Je ne peux pas retourner la vue normale à la demande Ajax car elle utiliserait alors la page de mise en page et j'obtiendrais une deuxième copie de la page de mise en page injectée. Cependant, je n'aime pas cela car cela m'oblige à créer des vues vides avec juste un @{Html.RenderPartial();}
en eux pour les requêtes GET standard.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Ensuite, dans Index.cshtml, procédez comme suit:
@{Html.RenderPartial("partialView");}
2) Je peux supprimer la désignation de mise en page de _viewstart et la spécifier manuellement lorsque la demande n'est PAS Ajax:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
Quelqu'un a-t-il une meilleure suggestion? Existe-t-il un moyen de renvoyer une vue sans sa page de mise en page? Il serait beaucoup plus facile de dire explicitement "ne pas inclure votre mise en page" s'il s'agit d'une requête ajax, que d'inclure explicitement la mise en page si ce n'est pas un ajax.