Je suis en train d'apprendre à propos de l'Amélioration Progressive, et j'ai une question à propos de AJAXifying points de vue. Dans mon MVC 3 projet j'ai une page de mise en page, un viewstart page, et deux plates points de vue.
Le viewstart page se trouve à la racine du dossier de Vues et s'applique ainsi à tous les points de vue. Il précise que tous les points de vue doivent utiliser _Layout.cshtml
de leur mise en page. La mise en page contient deux liens de navigation, un pour chaque vue. Les liaisons @Html.ActionLink()
pour se rendre à la page.
Maintenant, j'ai ajouté jQuery et veulent détourner ces liens et d'utiliser Ajax pour charger leur contenu sur la page dynamiquement.
<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 ya deux façons que je peux penser à faire cela, mais je n'aime pas particulièrement soit:
1) je peux prendre la totalité de la Vue du contenu et de les placer dans une vue partielle, alors le principal, l'affichage de la vue partielle lorsqu'il est rendu. De cette façon, en utilisant Request.IsAjaxRequest()
dans le contrôleur, je peux retourner View()
ou de retour PartialView()
basée sur si oui ou non la requête est une requête Ajax. Je ne peux pas retourner à l'affichage normal à la requête Ajax, car alors elle serait d'utiliser la mise en page et j'aimerais obtenir une deuxième copie de la mise en page injecté. Cependant, je n'aime pas ça parce que ça m'oblige à créer vide vues avec juste un @{Html.RenderPartial();}
pour le standard requêtes GET.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Puis dans l'Index.cshtml ce faire:
@{Html.RenderPartial("partialView");}
2) je peux supprimer la mise en page désignation de _viewstart et 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 une meilleure suggestion? Est-il un moyen de revenir à une vue sans sa mise en page? Il serait beaucoup plus facile à dire explicitement "n'incluent pas votre mise en page" si c'est une requête ajax, qu'il serait à inclure explicitement la mise en page si elle n'est pas ajax.