Contoh:
Model:
public class MyViewModel
{
[Required]
public string Foo { get; set; }
}
Pengendali:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
Melihat:
@model AppName.Models.MyViewModel
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<div id="result"></div>
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "result" }))
{
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
<input type="submit" value="OK" />
}
dan inilah contoh yang lebih baik (dalam perspektif saya):
Melihat:
@model AppName.Models.MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/index.js")" type="text/javascript"></script>
<div id="result"></div>
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
<input type="submit" value="OK" />
}
index.js
:
$(function () {
$('form').submit(function () {
if ($(this).valid()) {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (result) {
$('#result').html(result);
}
});
}
return false;
});
});
yang dapat lebih ditingkatkan dengan plugin formulir jQuery .
Saya pikir semua jawaban melewatkan satu poin penting:
Jika Anda menggunakan formulir Ajax sehingga perlu memperbarui sendiri (dan BUKAN div lain di luar formulir) maka Anda harus meletakkan div berisi di luar formulir. Sebagai contoh:
Kalau tidak, Anda akan berakhir seperti @David tempat hasilnya ditampilkan di halaman baru.
sumber
UnobtrusiveJavaScriptEnabled
ke mana punSaya mendapatkan solusi Darwin yang akhirnya berhasil tetapi membuat beberapa kesalahan terlebih dahulu yang menghasilkan masalah yang mirip dengan David (dalam komentar di bawah solusi Darwin) di mana hasilnya diposting ke halaman baru.
Karena saya harus melakukan sesuatu dengan formulir setelah metode kembali, saya menyimpannya untuk digunakan nanti:
Namun, variabel ini tidak memiliki properti "action" atau "method" yang digunakan dalam panggilan ajax.
Alih-alih, Anda perlu menggunakan variabel "ini":
sumber
jQuery
objek dengan formulir sebagai pemilih.form[0]
akan memiliki sifat. Ini juga praktik yang baik untuk mengawali setiapjQuery
variabel dengan$
agar lebih mudah mengidentifikasi mereka.Solusi Darin Dimitrov bekerja untuk saya dengan satu pengecualian. Ketika saya mengirimkan tampilan sebagian dengan kesalahan validasi (disengaja), saya berakhir dengan formulir duplikat yang dikembalikan dalam dialog:
Untuk memperbaikinya saya harus membungkus Html.BeginForm dalam div:
Ketika formulir dikirimkan, saya membersihkan div di fungsi keberhasilan dan menampilkan formulir yang divalidasi:
sumber
Partial Views
untuk membuat fungsi create di bawah halaman indeks. Saya bisa mendapatkan semua pesan validasi di Tampilan parsial. Tetapi ketikaCreate
berhasil, indeks ditampilkan dua kali. Saya tidak punyaHtml.BeginForm
dalam Tampilan Indeks saya.UpdateTargetId = "myForm"
sebagai gantinyaJika tidak ada validasi data yang dikecualikan, atau konten selalu dikembalikan di jendela baru, pastikan 3 baris ini ada di bagian atas tampilan:
sumber
Contoh
// Dalam Model
// Di PartailView //PartailView.cshtml
Dalam tampilan Index.cshtml
Di Kontroler
Anda harus melewati ViewName dan Model ke metode RenderPartialViewToString. itu akan mengembalikan tampilan Anda dengan validasi yang Anda terapkan dalam model dan menambahkan konten di div "targetId" di Index.cshtml. Saya dengan cara ini dengan menangkap RenderHtml dari tampilan parsial Anda dapat menerapkan validasi.
sumber
Bentuk Ajax bekerja secara asinkron menggunakan Javascript. Jadi diperlukan, untuk memuat file skrip untuk dieksekusi. Meskipun ini adalah kompromi kinerja yang kecil, eksekusi terjadi tanpa pos balik.
Kita perlu memahami perbedaan antara perilaku kedua bentuk Html dan Ajax.
Ajax:
Tidak akan mengarahkan ulang formulir, bahkan Anda melakukan RedirectAction ().
Akan melakukan simpan, perbarui, dan operasi modifikasi apa pun secara serempak.
Html:
Akan mengarahkan ulang formulir.
Akan melakukan operasi baik secara Sinkron dan Asinkron (Dengan beberapa kode dan perawatan tambahan).
Menunjukkan perbedaan dengan POC di tautan di bawah ini. Tautan
sumber
Sebelum menambahkan Ajax.BeginForm. Tambahkan skrip di bawah ini ke proyek Anda dalam urutan yang disebutkan,
Hanya dua ini yang cukup untuk melakukan operasi Ajax.
sumber