Bagaimana Anda mendapatkan daftar semua pesan kesalahan ModelState? Saya menemukan kode ini untuk mendapatkan semua kunci: ( Mengembalikan daftar kunci dengan kesalahan ModelState )
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Tetapi bagaimana saya bisa mendapatkan pesan kesalahan sebagai IList atau IQueryable?
Saya bisa pergi:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Tapi itu melakukannya secara manual - pasti ada cara untuk melakukannya menggunakan LINQ? Properti .ErrorMessage begitu jauh hingga saya tidak tahu cara menulis LINQ ...
.Where(kvp => kvp.Value.Errors.Count > 0)
Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
yang harus Anda gunakanvar errorList = modelState.Where(elem => elem.Value.Errors.Any()) .ToDictionary( kvp => kvp.Key, kvp => kvp.Value.Errors.Select(e => string.IsNullOrEmpty(e.ErrorMessage) ? e.Exception.Message : e.ErrorMessage).ToArray());
Jika tidak, Anda tidak akan memiliki ExceptionMessagesInilah implementasi penuh dengan semua bagian disatukan:
Pertama-tama buat metode ekstensi:
Kemudian panggil metode ekstensi itu dan kembalikan kesalahan dari tindakan pengontrol (jika ada) sebagai json:
Dan akhirnya, tunjukkan kesalahan tersebut di sisi klien (dalam gaya jquery.validation, tetapi dapat dengan mudah diubah ke gaya lain)
sumber
.Where(m => m.Value.Count() > 0)
juga dapat ditulis sebagai.Where(m => m.Value.Any())
.Saya suka menggunakan di
Hashtable
sini, sehingga saya mendapatkan objek JSON dengan properti sebagai kunci dan kesalahan sebagai nilai dalam bentuk array string.Dengan cara ini Anda mendapatkan respons berikut:
sumber
Ada banyak cara berbeda untuk melakukan ini agar semuanya berfungsi. Di sini sekarang saya melakukannya ...
sumber
BadRequest(ModelState)
dan serialiaze ke JSON untuk Anda.Cara termudah untuk melakukan ini adalah hanya mengembalikan a
BadRequest
dengan ModelState itu sendiri:Misalnya pada
PUT
:Jika kami menggunakan anotasi data pada mis. Nomor ponsel, seperti ini, di
Update
kelas:Ini akan mengembalikan yang berikut pada permintaan yang tidak valid:
sumber
@ JK sangat membantu saya tetapi mengapa tidak:
sumber
Lihatlah System.Web.Http.Results.OkNegotiatedContentResult.
Itu mengkonversi apapun yang Anda masukkan ke JSON.
Jadi saya melakukan ini
Ini menghasilkan:
Saya belum memeriksa apa yang terjadi ketika ada lebih dari satu kesalahan untuk setiap bidang tetapi intinya adalah OkNegoriatedContentResult brilian!
Dapatkan ide linq / lambda dari @SLaks
sumber
Cara sederhana untuk mencapai ini dengan menggunakan fungsionalitas bawaan
Hasil JSON akan menjadi
sumber
ToDictionary adalah ekstensi Enumerable yang ditemukan di System.Linq yang dikemas dalam System.Web.Extensions dll http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx . Inilah yang terlihat seperti kelas lengkap bagi saya.
sumber
Mengapa tidak mengembalikan
ModelState
objek asli ke klien, lalu gunakan jQuery untuk membaca nilai. Bagi saya itu terlihat lebih sederhana, dan menggunakan struktur data umum (.netModelState
)untuk mengembalikan
ModelState
as Json, cukup kirimkan ke konstruktor kelas Json (berfungsi dengan objek APA PUN)C #:
js:
sumber
Variasi dengan tipe pengembalian alih-alih mengembalikan IEnumerable
sumber
Saya membuat dan ekstensi yang mengembalikan string dengan "" separator (Anda dapat menggunakan milik Anda sendiri):
sumber
jika Anda menggunakan jsonresult kemudian kembali
atau Anda cukup mengembalikan modelStateErrors, saya belum mencobanya. Apa yang saya lakukan adalah menetapkan koleksi Kesalahan ke ViewModel saya dan kemudian loop itu .. Dalam hal ini saya dapat mengembalikan Kesalahan saya melalui json. Saya memiliki kelas / model, saya ingin mendapatkan sumber / kunci tetapi saya masih mencoba mencari tahu.
sumber