asp.net - MVC 3 空查询字符串参数值绑定(bind)为空字符串而不是 null

标签 asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 defaultmodelbinder

我有以下内容:

此操作:

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

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

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

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

谢谢

最佳答案

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

true if empty strings that are posted back in forms should be converted to null;
otherwise, false. The default value is 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;
        }
    }
}

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

示例:

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

Blog

关于asp.net - MVC 3 空查询字符串参数值绑定(bind)为空字符串而不是 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11023124/

相关文章:

c# - 当流文件完成使用 ASPNET MVC 3 下载时执行某些操作

asp.net-mvc - asp.net mvc 发布数据和页面刷新( session 变量 vs tempData vs 检测 F5)

asp.net - 我如何使用用 HttpRequest.SaveAs 保存的转储文件将请求重新发送到我的本地主机?

asp.net - ASP.Net Multi-Tenancy SaaS 应用程序中的本地化 (i18N)

javascript - 在 Ajax 成功函数中将参数传递给 javascript 函数?

javascript - 在 MVC javascript 部分解析 @?

c# - 从服务器端的路由值解析 url

c# - 在 ASP.NET MVC 中为多语言结构创建表单时需要帮助

asp.net - Visual Studio Publish 的动态文件夹名称

c# - 未找到与请求 URI 匹配的操作