Dengan peningkatan pada C # 6, sekarang Anda dapat menulis binder model yang sangat ringkas yang akan memangkas semua input string:
public class TrimStringModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var attemptedValue = value?.AttemptedValue;
return string.IsNullOrWhiteSpace(attemptedValue) ? attemptedValue : attemptedValue.Trim();
}
}
Anda harus memasukkan baris ini di suatu tempat di Application_Start()
dalam Global.asax.cs
file Anda untuk menggunakan pengikat model saat mengikat string
s:
ModelBinders.Binders.Add(typeof(string), new TrimStringModelBinder());
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 memiliki string
argumen sebagai metode tindakan
Sunting: 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:
public class TrimStringModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;
var unvalidatedValueProvider = bindingContext.ValueProvider as IUnvalidatedValueProvider;
var value = unvalidatedValueProvider == null ?
bindingContext.ValueProvider.GetValue(bindingContext.ModelName) :
unvalidatedValueProvider.GetValue(bindingContext.ModelName, !shouldPerformRequestValidation);
var attemptedValue = value?.AttemptedValue;
return string.IsNullOrWhiteSpace(attemptedValue) ? attemptedValue : attemptedValue.Trim();
}
}