【问题标题】:Why do I get null instead of empty string when receiving POST request in from Razor View?从 Razor View 接收 POST 请求时,为什么我得到 null 而不是空字符串?
【发布时间】:2011-04-08 04:33:15
【问题描述】:

我曾经在没有值的时候收到空字符串:

[HttpPost]
public ActionResult Add(string text)
{
    // text is "" when there's no value provided by user
}

但现在我正在传递一个模型

[HttpPost]
public ActionResult Add(SomeModel Model)
{
    // model.Text is null when there's no value provided by user
}

所以我必须使用?? "" 运算符。

为什么会这样?

【问题讨论】:

标签: asp.net-mvc string razor null viewmodel


【解决方案1】:

默认模型绑定将为您创建一个新的 SomeModel。 string 类型的默认值为 null,因为它是引用类型,所以它被设置为 null。

这是 string.IsNullOrEmpty() 方法的用例吗?

【讨论】:

  • 是的,我就是这么想的。我没有意识到字符串类型的默认值为 null,但不是 String.Empty。不,IsNullOrEmpty 方法不是这种情况,我的 SQL 表中没有 NULL 列,所以当有空字符串时出现异常。所以我想我将不得不继续使用?? ““ 操作员。谢谢!
  • 您也可以使用带有后备存储的属性并从 ViewModel 返回 string.empty 而不是 null,例如:
  • 哎呀!这是一些伪代码:私有字符串_text;公共字符串文本 { 获取 { 返回 _text; } 设置 { _text = 价值 ??字符串。空; }} -- 类似的东西
【解决方案2】:

您可以在模型类的属性上使用DisplayFormat 属性:

[DisplayFormat(ConvertEmptyStringToNull = false)]

【讨论】:

  • 这有助于我在执行操作之前进行隐式模型绑定。将它与 MetadataTypeAttribute 一起使用来标记 Entity Framework Model-First 类的自动生成属性
  • 这绝对是应该知道的。
  • 我正在使用:public ActionResult Quotations(string projectName, string brandName, string modelName, string clientName) { var model = _dataAccess.Quotations_Select(projectName, brandName, modelName, clientName); return View(model); } 调用存储过程并提供值,因此,该属性对我不起作用。我该怎么办?
  • 这是一条漫长的道路,但在 MVC6 中,如果您(像我一样)出于某种原因不想通过属性设置它并希望将元数据存储在其他地方,您可以编写您的拥有自己的元数据提供程序并在 Startup.cs 中注册它,例如:AddMvc(o => ModelMetadataDetailsProviders.Add(new YourProvider()))。在GetDisplayMetadata 中,您可以完成属性所做的所有事情。对于这个问题,它将是context.DisplayMetadata.ConvertEmptyStringToNull = false;
  • 这与我对该物业的其他验证相冲突。我最终创建了一个带有支持字段的属性,如果支持字段为空,则 get 返回空字符串。
【解决方案3】:

我正在创建和编辑中尝试此操作(我的对象称为“实体”):-

        if (ModelState.IsValid)
        {
            RemoveStringNull(entity);
            db.Entity.Add(entity);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(entity);
    }

这叫:-

    private void RemoveStringNull(object entity)
    {
        Type type = entity.GetType();
        FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.GetField | BindingFlags.Public | BindingFlags.NonPublic);
        for (int j = 0; j < fieldInfos.Length; j++)
        {
            FieldInfo propertyInfo = fieldInfos[j];
            if (propertyInfo.FieldType.Name == "String" )
            {
                object obj = propertyInfo.GetValue(entity);
                if(obj==null)
                    propertyInfo.SetValue(entity, "");
            }
        }
    }

如果您使用 Database First 并且您的 Model 属性每次都被清除,或者其他解决方案失败,这将很有用。

【讨论】:

    猜你喜欢
    • 2021-09-02
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多