@ Takepara'nın cevabının başka bir varyasyonu, ancak farklı bir bükülme ile:
1) Ben tercih "StringTrim" öznitelik mekanizması tercih (@Anton devre dışı "NoTrim" örneği yerine).
2) ModelState'in doğru şekilde doldurulduğundan emin olmak için SetModelValue öğesine ek bir çağrı yapılması ve varsayılan doğrulama / kabul / reddetme kalıbı normal olarak kullanılabilir, yani uygulamak için TryUpdateModel (model) ve tüm değişiklikleri kabul etmek için ModelState.Clear ().
Bunu varlık / paylaşılan kitaplığınıza koyun:
/// <summary>
/// Denotes a data field that should be trimmed during binding, removing any spaces.
/// </summary>
/// <remarks>
/// <para>
/// Support for trimming is implmented in the model binder, as currently
/// Data Annotations provides no mechanism to coerce the value.
/// </para>
/// <para>
/// This attribute does not imply that empty strings should be converted to null.
/// When that is required you must additionally use the <see cref="System.ComponentModel.DataAnnotations.DisplayFormatAttribute.ConvertEmptyStringToNull"/>
/// option to control what happens to empty strings.
/// </para>
/// </remarks>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class StringTrimAttribute : Attribute
{
}
Ardından bu MVC uygulamanızda / kütüphanenizde:
/// <summary>
/// MVC model binder which trims string values decorated with the <see cref="StringTrimAttribute"/>.
/// </summary>
public class StringTrimModelBinder : IModelBinder
{
/// <summary>
/// Binds the model, applying trimming when required.
/// </summary>
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// Get binding value (return null when not present)
var propertyName = bindingContext.ModelName;
var originalValueResult = bindingContext.ValueProvider.GetValue(propertyName);
if (originalValueResult == null)
return null;
var boundValue = originalValueResult.AttemptedValue;
// Trim when required
if (!String.IsNullOrEmpty(boundValue))
{
// Check for trim attribute
if (bindingContext.ModelMetadata.ContainerType != null)
{
var property = bindingContext.ModelMetadata.ContainerType.GetProperties()
.FirstOrDefault(propertyInfo => propertyInfo.Name == bindingContext.ModelMetadata.PropertyName);
if (property != null && property.GetCustomAttributes(true)
.OfType<StringTrimAttribute>().Any())
{
// Trim when attribute set
boundValue = boundValue.Trim();
}
}
}
// Register updated "attempted" value with the model state
bindingContext.ModelState.SetModelValue(propertyName, new ValueProviderResult(
originalValueResult.RawValue, boundValue, originalValueResult.Culture));
// Return bound value
return boundValue;
}
}
Özellik değerini ciltte ayarlamazsanız, hiçbir şeyi değiştirmek istemeseniz bile, bu özelliği ModelState'ten tamamen engelleyeceksiniz! Bunun nedeni, tüm dize türlerini bağlama olarak kayıtlı olmanızdır, bu nedenle (bağlantımda) varsayılan ciltleyicinin sizin için yapamayacağı görünür.