Saya menggunakan ASP.NET MVC dan saya ingin semua pengguna memasukkan bidang string untuk dipangkas sebelum dimasukkan ke dalam basis data. Dan karena saya memiliki banyak formulir entri data, saya mencari cara yang elegan untuk memangkas semua string, bukannya secara eksplisit memangkas setiap nilai string yang disediakan pengguna. Saya tertarik untuk mengetahui bagaimana dan kapan orang-orang memotong tali.
Saya berpikir tentang mungkin membuat pengikat model khusus dan memotong nilai string apa pun di sana ... dengan cara itu, semua logika pemangkasan saya terkandung di satu tempat. Apakah ini pendekatan yang baik? Apakah ada contoh kode yang melakukan ini?
asp.net
asp.net-mvc
model-binders
Johnny Oshika
sumber
sumber
type="password"
input tidak tersentuh?Ini adalah @takepara resolusi yang sama tetapi sebagai IModelBinder bukan DefaultModelBinder sehingga menambahkan modelbinder di global.asax melalui
Kelas:
berdasarkan pada posting @haacked: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
sumber
return
pernyataan dan dengan meniadakan kondisinya:if (valueResult == null || string.IsNullOrEmpty(valueResult.AttemptedValue)) return null;
[AllowHtml]
atribut pada model properties (bersama dengan[ValidateInput(false)]
CodeGrue seperti yang disebutkan di atasSatu peningkatan pada jawaban @takepara.
Suatu tempat dalam proyek:
Dalam perubahan kelas TrimModelBinder
untuk
dan Anda dapat menandai properti yang dikecualikan dari pemangkasan dengan atribut [NoTrim].
sumber
.Cast<object>().Any(a => a.GetType() == typeof(NoTrimAttribute))
dengan.OfType<NoTrimAttribute>().Any()
. Sedikit lebih bersih.Dengan peningkatan pada C # 6, sekarang Anda dapat menulis binder model yang sangat ringkas yang akan memangkas semua input string:
Anda harus memasukkan baris ini di suatu tempat di
Application_Start()
dalamGlobal.asax.cs
file Anda untuk menggunakan pengikat model saat mengikatstring
s:Saya merasa lebih baik menggunakan pengikat model seperti ini, daripada mengganti pengikat model default, karena kemudian akan digunakan setiap kali Anda mengikat
string
, apakah itu secara langsung sebagai argumen metode atau sebagai properti pada kelas model. Namun, jika Anda mengganti pengikat model default seperti yang disarankan oleh jawaban lain di sini, itu hanya akan berfungsi saat mengikat properti pada model, bukan ketika Anda memilikistring
argumen sebagai metode tindakanSunting: seorang komentator bertanya tentang berurusan dengan situasi ketika sebuah bidang tidak boleh divalidasi. Jawaban asli saya dikurangi untuk menangani hanya dengan pertanyaan yang diajukan OP, tetapi bagi mereka yang tertarik, Anda dapat menangani validasi dengan menggunakan pengikat model tambahan berikut:
sumber
Di ASP.Net Core 2 ini bekerja untuk saya. Saya menggunakan
[FromBody]
atribut di pengontrol dan input JSON saya. Untuk mengganti penanganan string dalam deserialization JSON, saya mendaftarkan JsonConverter saya sendiri:Dan ini konverternya:
sumber
Varian lain dari jawaban @ takepara tetapi dengan sentuhan berbeda:
1) Saya lebih suka mekanisme atribut opt-in "StringTrim" (bukan contoh "NoTrim" opt-out dari @Anton).
2) Panggilan tambahan ke SetModelValue diperlukan untuk memastikan ModelState diisi dengan benar dan pola validasi / terima / tolak standar dapat digunakan seperti biasa, yaitu TryUpdateModel (model) untuk menerapkan dan ModelState.Clear () untuk menerima semua perubahan.
Letakkan ini di entitas / perpustakaan bersama Anda:
Maka ini di aplikasi / perpustakaan MVC Anda:
Jika Anda tidak menetapkan nilai properti di binder, bahkan ketika Anda tidak ingin mengubah apa pun, Anda akan memblokir properti itu dari ModelState sama sekali! Ini karena Anda terdaftar sebagai pengikatan semua jenis string, jadi tampaknya (dalam pengujian saya) bahwa pengikat default tidak akan melakukannya untuk Anda saat itu.
sumber
Info tambahan untuk siapa pun yang mencari cara melakukannya di ASP.NET Core 1.0. Logika sudah banyak berubah.
Saya menulis posting blog tentang bagaimana melakukannya , itu menjelaskan hal-hal secara lebih rinci
Jadi solusi ASP.NET Core 1.0:
Model pengikat untuk melakukan pemangkasan yang sebenarnya
Anda juga memerlukan Penyedia Pengikat Model dalam versi terbaru, ini memberitahu bahwa pengikat ini harus digunakan untuk model ini
Maka harus terdaftar di Startup.cs
sumber
Sambil membaca jawaban dan komentar luar biasa di atas, dan menjadi semakin bingung, tiba-tiba saya berpikir, hei, saya ingin tahu apakah ada solusi jQuery. Jadi untuk orang lain yang, seperti saya, menemukan ModelBinders sedikit membingungkan, saya menawarkan potongan jQuery berikut yang memangkas bidang input sebelum formulir dikirimkan.
sumber
Dalam hal MVC Core
Bahan pengikat:
Pemberi:
Fungsi pendaftaran:
Daftar:
sumber
SimpleTypeModelBinderProvider
dengan mempertahankan indeks yang sama.Terlambat ke pesta, tetapi berikut ini adalah ringkasan penyesuaian yang diperlukan untuk MVC 5.2.3 jika Anda ingin menangani
skipValidation
persyaratan penyedia nilai bawaan.Global.asax
sumber
Saya tidak setuju dengan solusinya. Anda harus mengganti GetPropertyValue karena data untuk SetProperty juga dapat diisi oleh ModelState. Untuk menangkap data mentah dari elemen input tulis ini:
Saring oleh propertyDescriptor PropertyType jika Anda benar-benar hanya tertarik pada nilai-nilai string tetapi itu tidak masalah karena semua yang ada pada dasarnya adalah sebuah string.
sumber
Untuk ASP.NET Core , ganti
ComplexTypeModelBinderProvider
dengan penyedia yang memotong string.Dalam
ConfigureServices
metode kode startup Anda , tambahkan ini:Definisikan
TrimmingModelBinderProvider
seperti ini:Bagian buruk dari ini adalah copy dan paste dari
GetBinder
logikaComplexTypeModelBinderProvider
, tetapi tampaknya tidak ada kait untuk membiarkan Anda menghindari ini.sumber
Saya membuat penyedia nilai untuk memotong nilai parameter string kueri dan nilai formulir. Ini diuji dengan ASP.NET Core 3 dan bekerja dengan sempurna.
Kemudian daftarkan pabrik penyedia nilai dalam
ConfigureServices()
fungsi di Startup.cssumber
Ada banyak posting yang menyarankan pendekatan atribut. Berikut adalah paket yang sudah memiliki atribut trim dan banyak lainnya: Dado.ComponentModel.Mutations atau NuGet
Setelah panggilan ke Mutate (), user.UserName akan dimutasi ke
m@x_speed.01!
.Contoh ini akan memangkas spasi dan huruf besar-kecil string. Itu tidak memperkenalkan validasi, tetapi
System.ComponentModel.Annotations
dapat digunakan bersamaDado.ComponentModel.Mutations
.sumber
Saya memposting ini di utas lainnya. Di asp.net core 2, saya pergi ke arah yang berbeda. Saya menggunakan filter tindakan sebagai gantinya. Dalam hal ini pengembang dapat mengaturnya secara global atau menggunakan atribut untuk tindakan yang ingin diterapkannya pemangkasan string. Kode ini berjalan setelah pengikatan model telah terjadi, dan dapat memperbarui nilai-nilai dalam objek model.
Ini kode saya, pertama buat filter tindakan:
Untuk menggunakannya, daftarkan sebagai filter global atau hiasi tindakan Anda dengan atribut TrimInputStrings.
sumber