ฉันกำลังเรียนรู้เกี่ยวกับการเพิ่มประสิทธิภาพแบบก้าวหน้าและฉันมีคำถามเกี่ยวกับมุมมอง AJAXifying ในโครงการ MVC 3 ของฉันฉันมีหน้าเลย์เอาต์หน้าเริ่มต้นและมุมมองธรรมดาสองมุมมอง
หน้าเริ่มต้นอยู่ในรูทของโฟลเดอร์มุมมองและใช้กับมุมมองทั้งหมด มันระบุว่ามุมมองทั้งหมดควรใช้_Layout.cshtml
สำหรับหน้าเค้าโครงของพวกเขา หน้าเลย์เอาต์มีลิงก์การนำทางสองลิงก์หนึ่งรายการสำหรับแต่ละมุมมอง การเชื่อมโยงการใช้งาน@Html.ActionLink()
ที่จะทำให้ตัวเองไปยังหน้า
ตอนนี้ผมได้เพิ่ม jQuery และต้องการที่จะจี้เชื่อมโยงเหล่านี้และใช้อาแจ็กซ์ในการโหลดเนื้อหาของพวกเขาบนหน้าเว็บแบบไดนามิก
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
มีสองวิธีที่ฉันสามารถคิดทำ แต่ฉันไม่ชอบโดยเฉพาะอย่างยิ่ง:
1) ฉันสามารถนำเนื้อหาทั้งหมดของมุมมองและวางไว้ในมุมมองบางส่วนจากนั้นให้มุมมองหลักเรียกมุมมองบางส่วนเมื่อมีการแสดงผล ด้วยวิธีนี้Request.IsAjaxRequest()
ในการใช้งานคอนโทรลเลอร์ฉันสามารถส่งคืนView()
หรือส่งคืนข้อมูลPartialView()
โดยพิจารณาว่าคำขอนั้นเป็นคำขอ Ajax หรือไม่ ฉันไม่สามารถคืนค่ามุมมองปกติไปยังคำขอ Ajax ได้เพราะจะใช้หน้าเลย์เอาต์และฉันจะได้รับสำเนาชุดที่สองของหน้าเลย์เอาต์ อย่างไรก็ตามฉันไม่ชอบสิ่งนี้เพราะมันบังคับให้ฉันสร้างมุมมองว่างเปล่าที่มีเพียงแค่@{Html.RenderPartial();}
ในมุมมองสำหรับคำขอ GET มาตรฐาน
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
จากนั้นใน Index.cshtml ทำสิ่งนี้:
@{Html.RenderPartial("partialView");}
2) ฉันสามารถลบการกำหนดเค้าโครงจาก _viewstart และระบุด้วยตนเองเมื่อคำขอไม่ใช่ Ajax:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
ไม่มีใครมีข้อเสนอแนะที่ดีกว่า? มีวิธีคืนมุมมองโดยไม่มีหน้าเลย์เอาต์หรือไม่ มันจะง่ายกว่ามากที่จะพูดอย่างชัดเจนว่า "ไม่รวมเลย์เอาต์ของคุณ" ถ้ามันเป็นคำขออาแจ็กซ์