7

作成していない 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 );
}
4

3 に答える 3

2

NoTrimは見栄えが良いですが[Required]、空白を拒否するのはその属性です。

RequiredAttribute属性は、フォームのフィールドが検証されるときに、フィールドに値が含まれている必要があることを指定します。プロパティがnullの場合、空の文字列( "")が含まれている場合、または空白文字のみが含まれている場合は、検証例外が発生します。

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx

この問題を回避するには、独自のバージョンの属性を作成するか、RegexAttributeを使用します。AllowEmptyStringsプロパティが機能するかどうかはわかりません。

于 2012-07-11T21:43:04.720 に答える
0

I would just replace the " " with something like "-1" or "-". If this is the only case, of course...

于 2012-07-11T22:33:44.920 に答える