我有一个复选框,我想在我的 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 的实际值将始终为 true
或 false
,即不为空。
关于c# - MVC 使用 Html.CheckBoxFor 和可为空的 Bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40490036/