Dzięki ulepszeniom w C # 6 możesz teraz napisać bardzo kompaktowy spinacz modelu, który będzie przycinał wszystkie dane wejściowe ciągu:
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();
}
}
Trzeba to gdzieś w tej linii Application_Start()
w Global.asax.cs
pliku, aby użyć spinacza modelu podczas wiązania string
s:
ModelBinders.Binders.Add(typeof(string), new TrimStringModelBinder());
Uważam, że lepiej jest użyć spinacza modelu, takiego jak ten, zamiast nadpisywać domyślny spinacz modelu, ponieważ będzie on używany zawsze, gdy będziesz wiązać a string
, niezależnie od tego, czy jest to bezpośrednio jako argument metody, czy jako właściwość w klasie modelu. Jeśli jednak zastąpisz domyślny spinacz modelu, jak sugerują inne odpowiedzi tutaj, będzie to działać tylko w przypadku wiązania właściwości w modelach, a nie wtedy, gdy masz string
argument do metody akcji
Edycja: komentator zapytany o rozwiązanie sytuacji, w której pole nie powinno być walidowane. Moja pierwotna odpowiedź została ograniczona tylko do pytania zadanego przez OP, ale dla zainteresowanych możesz poradzić sobie z walidacją, używając następującego rozszerzonego segregatora:
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();
}
}