将 CheckBoxFor 绑定为 bool?

问题描述 投票:0回答:4

如何将可为 null 的 bool 绑定到 MVC 2 中的复选框。我尝试在视图中使用此代码:

<%: Html.CheckBoxFor(model =>  model.Communication.Before)%>

但是显示编译错误。

提前致谢。

asp.net asp.net-mvc-2 c#-4.0
4个回答
3
投票

我知道这个问题。您可以尝试使用此解决方法:

在您的 ViewModel 中创建名为 Before 的新属性:

public class YoursViewModel 
{
    public Communication Communication { get; set; }

    public bool Before
    {
        get
        {
            bool result;
            if (this.Communication.Before.HasValue)
            {
                result = (bool)this.Communication.Before.Value;
            }
            else
            {
                result = false;
            }

            return result;
        }
        set
        {
            this.Communication.Before = value;
        }
    }
}

此外,您还必须小心通信属性,必须在使用之前对其进行实例化。例如,当您在控制器中初始化 ViewModel 时,您还必须初始化此属性。

ControllerAction()
{
  YoursViewModel model = ViewModelFactory.CreateViewModel<YoursViewModel >("");
  model.Communication = new Communication ();
  return View(model);
}

谢谢 伊万·巴耶夫


2
投票

复选框可以有两种状态:选中/未选中、真/假、1/0。因此,尝试将复选框绑定到可能具有三种状态的属性并不真正适合这种情况。我建议您调整视图模型,以便它使用不可为空的布尔属性。如果在您的域模型中您有一个无法更改的可为空布尔值,您可以在域模型和视图模型之间的映射层中执行此操作。


1
投票

MVC 视图中绑定 Checkbox 的一种方法

首先使用 EF 数据库,数据库中的布尔(位)字段会生成可为空的布尔值?生成的类中的属性。对于演示,我有一个名为 Dude 的表,其中包含字段

  • Id 唯一标识符
  • 名称 varchar(50)
  • 太棒了

以下类由 EF 生成:

namespace NullableEfDemo
{
 using System;
 public partial class Dude
 {
    public System.Guid Id { get; set; }
    public string Name { get; set; }
    public Nullable<bool> IsAwesome { get; set; }
 }
}

为了能够将 IsAwesome 绑定到复选框,我只需扩展 Dude 类。这是为了避免编辑生成的类(如果我需要刷新它)。所以我在我的项目中添加了一个代码文件DudePartial.cs(名称无关)。不要忘记声明或使用项目名称空间:

namespace NullableEfDemo
{
 partial class Dude
 {
    public bool Awesome
    {
        get { return IsAwesome ?? false; }
        set { IsAwesome = value; }
    }
  }
}

这声明了一个 bool 类型的新属性 Awesome,可以绑定到编辑视图中的复选框

@Html.CheckBoxFor(model => model.Awesome, new { @class = "control-label" })

在 HttpPost 中,我绑定模型 Awesome 属性而不是 IsAwesome。

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "Id,Name,Awesome")] Dude dude)
    {…

0
投票

取消勾选数据库中允许 NULL 的位列并添加默认值,例如0 然后将任何现有单元格从 Null 更改为 0 或 1(false 或 true) 这使您可以使用“价值”

© www.soinside.com 2019 - 2024. All rights reserved.