>我有以下内容:
此操作:
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(这是默认值)
当请求不包含这些项的值时,你将看到First
和Last
null
。
With ModelMetadata.ConvertEmptyStringToNull = false
当请求包含具有空值的参数时,属性将为"。如果请求不包含参数本身,则值仍将null
。