Saya belajar tentang Peningkatan Progresif dan saya punya pertanyaan tentang pandangan AJAXifying. Dalam proyek MVC 3 saya, saya memiliki halaman tata letak, halaman viewstart, dan dua tampilan biasa.
Halaman viewstart berada di root folder Views dan dengan demikian berlaku untuk semua tampilan. Ini menentukan bahwa semua tampilan harus digunakan _Layout.cshtml
untuk halaman tata letak mereka. Halaman tata letak berisi dua tautan navigasi, satu untuk setiap tampilan. Tautan digunakan @Html.ActionLink()
untuk menampilkan diri ke halaman.
Sekarang saya telah menambahkan jQuery dan ingin membajak tautan ini dan menggunakan Ajax untuk memuat konten mereka di halaman secara dinamis.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Ada dua cara yang bisa saya pikirkan untuk melakukan ini, tetapi saya tidak terlalu menyukai keduanya:
1) Saya dapat mengambil seluruh konten Tampilan dan menempatkannya dalam tampilan sebagian, kemudian meminta tampilan utama memanggil tampilan sebagian saat itu dibuat. Dengan begitu, menggunakan Request.IsAjaxRequest()
di controller, saya bisa kembali View()
atau kembali PartialView()
berdasarkan apakah permintaannya adalah permintaan Ajax atau tidak. Saya tidak bisa mengembalikan tampilan biasa ke permintaan Ajax karena kemudian akan menggunakan halaman tata letak dan saya akan mendapatkan salinan kedua dari halaman tata letak yang disuntikkan. Namun, saya tidak suka ini karena memaksa saya untuk membuat tampilan kosong hanya dengan @{Html.RenderPartial();}
di dalamnya untuk permintaan GET standar.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Kemudian di Index.cshtml lakukan ini:
@{Html.RenderPartial("partialView");}
2) Saya dapat menghapus penunjukan tata letak dari _viewstart dan menentukan secara manual ketika permintaan BUKAN Ajax:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
Adakah yang punya saran yang lebih baik? Apakah ada cara untuk mengembalikan tampilan tanpa halaman tata letaknya? Akan lebih mudah untuk secara eksplisit mengatakan "jangan sertakan tata letak Anda" jika itu adalah permintaan ajax, daripada secara eksplisit menyertakan tata letak jika itu bukan ajax.
Layout = ViewBag.LayoutFile
.Cukup letakkan kode berikut di bagian atas halaman
sumber
Saya lebih suka, dan menggunakan, opsi # 1 Anda. Saya tidak suka # 2 karena bagi saya
View()
menyiratkan Anda mengembalikan seluruh halaman. Ini harus menjadi halaman HTML yang sepenuhnya disempurnakan dan valid setelah mesin tampilan selesai dengannya.PartialView()
telah dibuat untuk mengembalikan potongan HTML sewenang-wenang.Saya tidak berpikir itu masalah besar untuk memiliki pandangan yang hanya menyebut sebagian. Itu masih KERING, dan memungkinkan Anda untuk menggunakan logika parsial dalam dua skenario.
Banyak orang tidak suka memecah-mecah jalur panggilan tindakan mereka
Request.IsAjaxRequest()
, dan saya bisa menghargai itu. Tetapi IMO, jika semua yang Anda lakukan adalah memutuskan apakah akan meneleponView()
atauPartialView()
kemudian cabang itu bukan masalah besar dan mudah dipelihara (dan diuji). Jika Anda menemukan diri Anda menggunakanIsAjaxRequest()
untuk menentukan sebagian besar dari bagaimana tindakan Anda dimainkan, maka membuat tindakan AJAX terpisah mungkin lebih baik.sumber
Buat dua tata letak: 1. tata letak kosong, 2. tata letak utama dan kemudian tulis dalam file _viewStart kode ini:
tentu saja, mungkin itu bukan solusi terbaik
sumber
Anda tidak harus membuat tampilan kosong untuk ini.
Di controller:
mengembalikan PartialViewResult akan menimpa definisi tata letak saat memberikan respons.
sumber
Dengan ASP.NET 5 tidak ada variabel Permintaan tersedia lagi. Anda dapat mengaksesnya sekarang dengan Context.Request
Juga tidak ada lagi Metode IsAjaxRequest (), Anda harus menulisnya sendiri, misalnya di Extensions \ HttpRequestExtensions.cs
Saya mencari beberapa saat sekarang tentang ini dan berharap itu akan membantu beberapa orang lain juga;)
Sumberdaya: https://github.com/aspnet/AspNetCore/issues/2729
sumber
Untuk aplikasi Ruby on Rails, saya dapat mencegah tata letak dari memuat dengan menentukan
render layout: false
dalam tindakan pengontrol yang ingin saya tanggapi dengan ajax html.sumber