2

私は次のものを持っています:

このアクション:

public virtual ActionResult Search(string search, string sort)
{
...
}

空のクエリ文字列パラメータを使用してこのURLから呼び出されます。

http://myurl.com/mycontroller/search?search=&sort=

私の理解では、MVC 2の時点で、DefaultModelBinderはこれらの値をnullのままにします。しかし、私が見つけたのは、それらが実際には空の文字列に設定されているということです。これは実際に予想される動作ですか?これはどこかに文書化されていますか?

ありがとう

4

3 に答える 3

6

はい、デフォルトの動作は空の文字列をnullに設定していますが、変更することでオーバーライドできますConvertEmptyStringToNull = false;

フォームにポストバックされる空の文字列をnullに変換する必要がある場合はtrue
それ以外の場合はfalse。デフォルト値はtrueです。

msdn

このコードのように:

public class SimpleArrayModelBinder : DefaultModelBinder 
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    {
        if (bindingContext.ModelType == typeof(string)) 
        {
            var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            bindingContext.ModelMetadata.ConvertEmptyStringToNull = false;
            if (value == null || value.AttemptedValue.IsNullOrEmpty())
                return "";
            else
                return value.AttemptedValue;
        }
    }
}

デフォルトの動作を変更するもう1つの方法はConvertEmptyStringToNull、モデルのプロパティの上にある属性を使用することです。

例:

public class Person
{
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string Lastname { get; set; }
    ...
}

ブログ

于 2012-06-13T20:55:07.817 に答える
1

DefaultModelBinder のソース コードを調べたところ、ModelMetadata.ConvertEmptyStringToNull プロパティは、バインドされているモデルが複雑なモデルの場合にのみチェックされることがわかりました。アクションで公開されるプリミティブ型の場合、値はそのまま取得されます。元の質問の例では、これは空の文字列になります。

DefaultModelBinder ソースから

        // Simple model = int, string, etc.; determined by calling TypeConverter.CanConvertFrom(typeof(string))
        // or by seeing if a value in the request exactly matches the name of the model we're binding.
        // Complex type = everything else.
        if (!performedFallback) {
            bool performRequestValidation = ShouldPerformRequestValidation(controllerContext, bindingContext);
            ValueProviderResult vpResult = bindingContext.UnvalidatedValueProvider.GetValue(bindingContext.ModelName, skipValidation: !performRequestValidation);
            if (vpResult != null) {
                return BindSimpleModel(controllerContext, bindingContext, vpResult);
            }
        }
        if (!bindingContext.ModelMetadata.IsComplexType) {
            return null;
        }

        return BindComplexModel(controllerContext, bindingContext);
    }

したがって、私が知る限り、ModelMetadata.ConvertEmptyStringToNull は複合型をバインドする場合にのみ適用されます。

于 2012-06-14T12:42:53.060 に答える
0

ModelMetadata.ConvertEmptyStringToNullこのプロパティは、 内のプロパティとして位置する文字列に値をバインドするときに影響しますModel

元。

public class Employee
{
   public string First{get;set;}
   public string Last{get;set;}
}

ModelMetadata.ConvertEmptyStringToNull = true (デフォルト)

リクエストにこれらの項目の値が含まれていない場合は、FirstLastasの両方が表示されます。null

ModelMetadata.ConvertEmptyStringToNull = false を使用

リクエストに値が空のパラメータが含まれている場合、プロパティは "" になります。リクエストにパラメータ自体が含まれていない場合でも、値は になりますnull

于 2012-06-14T04:37:49.920 に答える