【问题标题】:C# ASP.NET : Issue with check box and radio buttonC# ASP.NET:复选框和单选按钮的问题
【发布时间】:2020-03-06 10:06:25
【问题描述】:

我正在创建一个应用程序,用户填写一个表单,其中某些属性的设置不是强制性的。这包括复选框和单选按钮。

所以,我的模型中有这样的东西:

public class MyModel {
     public bool boolvalue;
     public MyTwoValuedType mytypevalue;
}

我在视图中:

@model MyModel

<form method="post">
   @Html.CheckBoxFor(m => m.boolvalue)

   @Html.RadioButtonFor(m => m.mytypevalue, mytypevalue.Value1)

   @Html.RadioButtonFor(m => m.mytypevalue, mytypevalue.Value2)
</form>

当我初始化视图时,我通过控制器中的return View(); 发送一个空模型,并且单选按钮没有值(未选中单选按钮)并且未选中复选框(因此其值为 false)。 但是,我想使用可为空的类型,例如(bool?MyTwoValuedType?),如果在没有用户更改复选框的值的情况下提交表单(在视图中)和单选按钮,它们没有默认值。即使表单的提交有错误,表单的重新出现(因为验证失败)在复选框和单选按钮中都有用户未设置的值......

我应该将Html.DropDownListFor 与可空类型一起使用而不是复选框和单选按钮吗?这样会有好的结果吗?

【问题讨论】:

    标签: c# html asp.net-mvc asp.net-core-mvc


    【解决方案1】:

    将@Html.DropDownListFor 用于可为空的属性,因为当您在视图中发送空模型然后在 POST 中您将得到 false 作为布尔返回。 布尔模型不能使用复选框。

    如果你想为布尔值使用复选框和单选,那么使用 jquery 来设置值。 但 DropdownList 最适合布尔模型属性。

    【讨论】:

      【解决方案2】:

      所以关于在复选框中使用nullable布尔值,这是不合适的,因为nullable布尔值可以存储3种状态:nulltruefalse。但是一个复选框只能有一个true 或一个false 对其进行控制。这是因为HTML Checkbox 不支持三态,因为当时还没有这个概念。它与旧的 Windows 窗体复选框共享该属性。所以你需要使用dropdownlist 来处理这三种状态。如果你想使用复选框,那么:

      • 停止使用nullable布尔值

      • 停止尝试使用checkbox,因为这样null 状态将转换为false

      【讨论】:

        【解决方案3】:

        你说:“我通过 return View() 发送一个空模型” - 检查模型是否为空。

        控制器:

         public ActionResult Index()
         {
             return View();
         }
        
         [HttpPost]
         public ActionResult Index(Models.MyModel m)
         {
             return View(m);
         }
        

        查看:

        <form method="post">
            @{
        
                if (Model == null)
                {
                    @Html.CheckBoxFor(m => m.boolvalue)
        
                    @Html.RadioButtonFor(m => m.mytypevalue,false);
        
                    @Html.RadioButtonFor(m => m.mytypevalue,false)
                }
                else
                {
                    @Html.CheckBoxFor(m => m.boolvalue)
        
                    @Html.RadioButtonFor(m => m.mytypevalue, Model.mytypevalue.Value1);
        
                    @Html.RadioButtonFor(m => m.mytypevalue, Model.mytypevalue.Value2)
                }
            }
        </form>
        

        型号:

        public class MyModel
        {
            public bool boolvalue;
            private MyTwoValuedType _mytypevalue;
            public MyTwoValuedType mytypevalue
            {
                get
                {
                    if (_mytypevalue == null)
                    {
                        _mytypevalue = new MyTwoValuedType();
                    }
                    return _mytypevalue;
                }
                set
                {
                    _mytypevalue = value;
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-18
          • 2019-11-13
          • 2011-09-09
          • 1970-01-01
          • 2016-11-28
          • 2011-10-18
          • 2016-03-03
          • 2023-04-06
          相关资源
          最近更新 更多