MVC 3 空查询字符串参数值绑定为空字符串而不是 null



>我有以下内容:

此操作:

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

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

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

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

谢谢

是的

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

如果表单中回发的空字符串应转换为 null,则为 true;
否则,为假。默认值为 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;
        }
    }
}

更改 deafult 行为的另一种方法是在模型中属性上方使用 ConvertEmptyStringToNull 属性。

例:

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

博客

在查看了 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仅在bindng复杂类型时适用。

ModelMetadata.ConvertEmptyStringToNull此属性

将影响何时将值绑定到作为Model中的属性的字符串。

前任。

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

With ModelMetadata.ConvertEmptyStringToNull = true(这是默认值)

当请求不包含这些项的值时,你将看到FirstLast null

With ModelMetadata.ConvertEmptyStringToNull = false

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

最新更新