c# - MVC 使用 Html.CheckBoxFor 和可为空的 Bool

标签 c# asp.net-mvc

我有一个复选框,我想在我的 View 中显示它与一个名为 public 的字段相关,它基本上说明特定行是否公开。在数据库中,这是一个位字段,但由于该表以前的工作方式,它允许空值。

我正在使用 Html.CheckBoxFor 但它提示这个字段,因为在系统中它不是 bool 类型,而是 bool?类型。我想要做的是拥有它,以便如果字段值为 null,那么它在前端被视为 false(不幸的是,更新数据库值本身不是一个选项)。

我已经尝试使用 GetValueOrDefault,并按照以下行将默认值放入我的模型文件中:

public class Model
{
    public bool? Public { get; set; }

    public SearchModel()
    { 
        Public = false;
    }
}

但是它在提示这个,给我以下错误:

An exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll but was not handled in user code

Additional information: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

所以我不确定如何从这里取得进展,有人可以帮我指明正确的方向吗?

编辑:

这是我试图用来显示复选框的 View 代码。在这种情况下,我添加了一些额外的 html 属性,以便它显示为切换而不是简单的复选框:

Html.CheckBoxFor(model => model.Public, new {data_toggle = "toggle", data_off = "No", data_on = "Yes", data_size = "small"})

最佳答案

当您将表达式传递给无法评估的模板化助手之一时,您会遇到特定的异常。请记住,当您使用基于表达式的助手时,您实际上并不是在按值传递属性,而是一个表达式,它代表模型上的一个属性,助手将使用它来引用该属性,从中生成字段名称等。

您没有在执行此操作的地方显示实际代码,但这意味着您基本上不能执行以下操作:

@Html.EditorFor(m => m.Public.GetValueOrDefault())

因为模板化助手无法将其解析为与模型中的属性匹配的表达式。

至于您在这里的实际基本关注点,即将值为 null 的值设置为 false,您只需要一个自定义的 getter 和 setter。 @utaco 的回答提供了更简单的 C# 6.0 自动实现属性默认方法:

public bool? Public { get; set; } = false;

对于以前版本的 C#,您需要以下内容:

private bool? public;
public bool? Public
{
    get { return public ?? false; }
    set { public = value; }
}

但是,当您无意将其实际设为 null 时,将 Public 保留为可为 null 的 bool 只会使您的代码更加困难。假设您可以将其更改为 bool(即,这是一个 View 模型,而不是绑定(bind)到数据库表的实际实体类),那么您应该这样做。不过,您仍然希望将 private 保留为可空。这允许您在 setter 中接受空值,但在 getter 中将它们强制为 false 值,这意味着 public 的实际值将始终为 truefalse,即不为空。

关于c# - MVC 使用 Html.CheckBoxFor 和可为空的 Bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40490036/

相关文章:

asp.net-mvc - MVC .NET如何在现有源代码中添加单元测试项目?

asp.net-mvc - 如何确定 mvc Controller 中的浏览器分辨率?

C# .. API httpclient 身份验证和使用用户名和密码的代理

javascript - C# 查找并按下 JS 创建的按钮

c# - 如何在 C# 中添加 BouncyCaSTLeProvider?

asp.net-mvc - 将来自 MVC 程序集中的资源的脚本和 CSS bundle 在一起

asp.net-mvc - MVC4 中未将自定义 EditorTemplate 用于 DataType.Date

c# - 无法在 System.DirectoryServices.AccountManagement.GroupPrincipal 中转换类型的对象

c# - 如何从类构造函数中捕获事件触发

asp.net-mvc - 堆栈跟踪错误