Tôi đang tìm hiểu về Tăng cường tiến bộ và tôi có một câu hỏi về quan điểm AJAXifying. Trong dự án MVC 3 của tôi, tôi có một trang bố cục, một trang xem và hai chế độ xem đơn giản.
Trang viewstart nằm trong thư mục gốc của thư mục Lượt xem và do đó áp dụng cho tất cả các lượt xem. Nó chỉ định rằng tất cả các khung nhìn nên sử dụng _Layout.cshtml
cho trang bố trí của chúng. Trang bố trí chứa hai liên kết điều hướng, một liên kết cho mỗi chế độ xem. Các liên kết sử dụng @Html.ActionLink()
để hiển thị chính họ đến trang.
Bây giờ tôi đã thêm jQuery và muốn chiếm quyền điều khiển các liên kết này và sử dụng Ajax để tải nội dung của chúng trên trang một cách linh hoạt.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Có hai cách tôi có thể nghĩ để làm điều này, nhưng tôi không đặc biệt thích một trong hai cách:
1) Tôi có thể lấy toàn bộ nội dung của Chế độ xem và đặt chúng ở chế độ xem một phần, sau đó có chế độ xem chính gọi chế độ xem một phần khi được hiển thị. Theo cách đó, bằng cách sử dụng Request.IsAjaxRequest()
trong bộ điều khiển, tôi có thể trả lại View()
hoặc trả về PartialView()
dựa trên việc yêu cầu đó có phải là yêu cầu Ajax hay không. Tôi không thể trả lại chế độ xem thông thường cho yêu cầu Ajax vì sau đó nó sẽ sử dụng trang bố cục và tôi sẽ nhận được một bản sao thứ hai của trang bố trí được đưa vào. Tuy nhiên, tôi không thích điều này bởi vì nó buộc tôi phải tạo các chế độ xem trống chỉ với một @{Html.RenderPartial();}
trong số chúng cho các yêu cầu GET tiêu chuẩn.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Sau đó, trong Index.cshtml làm điều này:
@{Html.RenderPartial("partialView");}
2) Tôi có thể xóa chỉ định bố cục khỏi _viewstart và chỉ định thủ công khi yêu cầu KHÔNG phải là Ajax:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
Có ai có một đề nghị tốt hơn? Có cách nào để trả về một khung nhìn mà không có trang bố trí của nó không? Sẽ dễ dàng hơn nhiều khi nói "không bao gồm bố cục của bạn" nếu đó là yêu cầu ajax, hơn là bao gồm rõ ràng bố cục nếu đó không phải là ajax.