作成していない ASP.NET MVC 2 アプリケーションに取り組んでいます。アプリケーションのすべての入力フィールドは、モデル バインド中にトリミングされます。ただし、特定のフィールドがトリミングされないようにする NoTrim 属性が必要です。
たとえば、次の状態ドロップダウン フィールドがあります。
<select name="State">
<option value="">Select one...</option>
<option value=" ">International</option>
<option value="AA">Armed Forces Central/SA</option>
<option value="AE">Armed Forces Europe</option>
<option value="AK">Alaska</option>
<option value="AL">Alabama</option>
...
問題は、ユーザーが「国際」を選択すると、2 つのスペースが削除され、State が必須フィールドであるため、検証エラーが発生することです。
これが私ができるようにしたいことです:
[Required( ErrorMessage = "State is required" )]
[NoTrim]
public string State { get; set; }
これまでのところ、属性について私が持っているものは次のとおりです。
[AttributeUsage( AttributeTargets.Property, AllowMultiple = false )]
public sealed class NoTrimAttribute : Attribute
{
}
Application_Start で設定されるカスタム モデル バインダーがあります。
protected void Application_Start()
{
ModelBinders.Binders.DefaultBinder = new MyModelBinder();
...
トリミングを行うモデル バインダーの部分を次に示します。
protected override void SetProperty( ControllerContext controllerContext,
ModelBindingContext bindingContext,
PropertyDescriptor propertyDescriptor,
object value )
{
if (propertyDescriptor.PropertyType == typeof( String ) && !propertyDescriptor.Attributes.OfType<NoTrimAttribute>().Any() )
{
var stringValue = (string)value;
if (!string.IsNullOrEmpty( stringValue ))
{
value = stringValue.Trim();
}
}
base.SetProperty( controllerContext, bindingContext, propertyDescriptor, value );
}