Saya memiliki tindakan ASP.NET MVC sederhana seperti ini:
public ActionResult Edit(EditPostViewModel data)
{
}
The EditPostViewModel
memiliki atribut validasi seperti ini:
[Display(Name = "...", Description = "...")]
[StringLength(100, MinimumLength = 3, ErrorMessage = "...")]
[Required()]
public string Title { get; set; }
Dalam tampilan saya menggunakan pembantu berikut:
@Html.LabelFor(Model => Model.EditPostViewModel.Title, true)
@Html.TextBoxFor(Model => Model.EditPostViewModel.Title,
new { @class = "tb1", @Style = "width:400px;" })
Jika saya melakukan submit pada formulir yang textbox ini ditempatkan di validasi akan dilakukan pertama pada klien dan kemudian pada service ( ModelState.IsValid
).
Sekarang saya punya beberapa pertanyaan:
Bisakah ini digunakan dengan jQuery ajax submit? Apa yang saya lakukan hanyalah menghapus formulir dan mengklik tombol kirim, javascript akan mengumpulkan data dan kemudian menjalankan
$.ajax
.Akankah sisi server
ModelState.IsValid
berfungsi?Bagaimana saya bisa meneruskan masalah validasi kembali ke klien dan menampilkannya seolah-olah saya menggunakan build int validation (
@Html.ValidationSummary(true)
)?
Contoh panggilan Ajax:
function SendPost(actionPath) {
$.ajax({
url: actionPath,
type: 'POST',
dataType: 'json',
data:
{
Text: $('#EditPostViewModel_Text').val(),
Title: $('#EditPostViewModel_Title').val()
},
success: function (data) {
alert('success');
},
error: function () {
alert('error');
}
});
}
Edit 1:
Disertakan di halaman:
<script src="/Scripts/jquery-1.7.1.min.js"></script>
<script src="/Scripts/jquery.validate.min.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script>
Jawaban:
Sisi klien
Menggunakan
jQuery.validate
pustaka seharusnya cukup sederhana untuk disiapkan.Tentukan pengaturan berikut di
Web.config
file Anda :Saat Anda membangun tampilan, Anda akan mendefinisikan hal-hal seperti ini:
CATATAN: Ini perlu didefinisikan dalam elemen formulir
Maka Anda perlu menyertakan pustaka berikut:
Ini seharusnya dapat menyiapkan Anda untuk validasi sisi klien
Sumber daya
Sisi server
CATATAN: Ini hanya untuk validasi sisi server tambahan di atas
jQuery.validation
perpustakaanMungkin sesuatu seperti ini bisa membantu:
Dimana
ValidateAjax
atribut didefinisikan sebagai:Apa yang dilakukannya adalah mengembalikan objek JSON yang menentukan semua kesalahan model Anda.
Contoh tanggapannya adalah
Ini akan dikembalikan ke kesalahan Anda saat menangani panggilan balik dari
$.ajax
panggilan tersebutAnda dapat melakukan perulangan melalui data yang dikembalikan untuk mengatur pesan kesalahan sesuai kebutuhan berdasarkan Kunci yang dikembalikan (saya pikir sesuatu seperti
$('input[name="' + err.key + '"]')
akan menemukan elemen input Andasumber
for (var i = 0; i < modelStateErrors.length; i++) { $('span[data-valmsg-for="' + modelStateErrors[i].key + '"]').text(modelStateErrors[i].errors[0]); }
Apa yang harus Anda lakukan adalah membuat data formulir Anda dan mengirimkannya ke tindakan pengontrol. ASP.NET MVC akan mengikat data formulir ke
EditPostViewModel
objek (parameter metode tindakan Anda), menggunakan fitur pengikatan model MVC.Anda dapat memvalidasi formulir Anda di sisi klien dan jika semuanya baik-baik saja, kirim data ke server. The
valid()
Metode akan berguna.sumber
Berikut solusi yang agak sederhana:
Di pengontrol kami mengembalikan kesalahan kami seperti ini:
Berikut beberapa skrip klien:
Begitulah cara kami menanganinya melalui ajax:
Juga, saya membuat tampilan parsial melalui ajax dengan cara berikut:
Metode RenderRazorViewToString:
sumber
PartialView
ke Ajax?Menambahkan beberapa logika lagi ke solusi yang disediakan oleh @Andrew Burgess. Inilah solusi lengkapnya:
Membuat filter tindakan untuk mendapatkan kesalahan untuk permintaan ajax:
Menambahkan filter ke metode pengontrol saya sebagai:
Menambahkan skrip umum untuk validasi jquery:
Akhirnya menambahkan metode javascript kesalahan ke formulir Ajax Begin saya:
sumber
Anda bisa melakukannya dengan cara ini:
( Sunting: Menimbang bahwa Anda sedang menunggu tanggapan
json
dengandataType: 'json'
).BERSIH
JS:
Jika perlu, saya juga bisa menjelaskan cara melakukannya dengan mengembalikan error 500, dan mendapatkan error di acara error (ajax). Tetapi dalam kasus Anda, ini mungkin menjadi pilihan
sumber