2

我有以下内容:

这个动作:

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

使用空查询字符串参数从此 url 调用:

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

现在我的理解是,从 MVC 2 开始,DefaultModelBinder 会将这些值保留为空值。但是,我发现它们实际上设置为空字符串。这实际上是预期的行为吗?这在任何地方都有记录吗?

谢谢

4

3 回答 3

6

是的,默认行为是将空字符串设置为空,但可以通过更改来覆盖它ConvertEmptyStringToNull = false;

如果在表单中回发的空字符串应转换为 null ,则为true
否则为假。默认值为 true

微软

就像在这段代码中:

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;
        }
    }
}

更改默认行为的另一种方法是使用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此属性将影响将值绑定到作为属性位于 a 中的字符串时Model

前任。

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

使用 ModelMetadata.ConvertEmptyStringToNull = true (默认)

当请求不包含这些项目的值时,First您将看到两者。Lastnull

使用 ModelMetadata.ConvertEmptyStringToNull = false

当请求包含具有空值的参数时,属性将为 ""。如果请求本身不包含参数,那么值仍然是null.

于 2012-06-14T04:37:49.920 回答