【问题标题】:HTML.Checkboxfor to Toggle button HTML?HTML.Checkboxfor 切换按钮 HTML?
【发布时间】:2017-08-15 11:03:52
【问题描述】:

是否有将@HTML.Checkboxfor 转换为切换html 按钮的方法? 我参考了https://www.w3schools.com/howto/howto_css_switch.asp的切换按钮样式@

目前它正在使用:

@Html.CheckBoxFor(model => model.IsEnabled, new { @checked = "checked", @Name = "DelegateChkBox" })

改为:

    <td class="slider-td">
         <label class="switch">
            <input name="DelegateChkBox" id="IsEnabled" type="checkbox" value="true" data-val-required="The IsEnabled field is required." data-val="true" data-bind="checked: IsEnabled">
          <div class="slider round"></div>
          </label>
   </td>

切换按钮仅在选中时才有效并回发到控制器:

否则默认情况下它不会回发到控制器 UNCHECKED :

任何帮助将不胜感激! 谢谢!

【问题讨论】:

  • 可能不相关,但您有一个名为 IsEnabled 的属性,但随后您将 name 属性更改为 DelegateChkBox,这将永远不会绑定到您的模型(您永远不应该更改 name属性)。而且您永远不会设置 checked 属性 - 这是由基于 IsEnabled 值的 CheckBoxFor() 方法正确完成的。
  • 并且未选中的复选框不会提交值,这就是 CheckBoxFor() 方法生成 2 个输入的原因 - &lt;input type="checkbox" .. value="true" /&gt;&lt;input type="hidden" value="false" /&gt;
  • 你可以使用@Html.CheckBox()而不是手动创建你的html - 你只需要修改css选择器
  • 试试Switchery插件

标签: html asp.net-mvc css asp.net-mvc-4 html-helper


【解决方案1】:

根据一些实验和发现,我发现您需要包含由助手 (Html.CheckBoxFor) 生成的隐藏字段,如下面的样式所示:

<style type="text/css">
.switch {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 34px;
}

.switch input {display:none;}

.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #ccc;
  transition: .4s;
}

.slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background-color: white;
  transition: .4s;
}

/* include generated hidden field here */
input[type="checkbox"]:checked + input[type="hidden"] + .slider,
input[type="checkbox"]:checked + .slider {
  background-color: #2196F3;
}

/* include generated hidden field here */
input[type="checkbox"]:focus + input[type="hidden"] + .slider,
input[type="checkbox"]:focus + .slider {
  box-shadow: 0 0 1px #2196F3;
}

/* include generated hidden field here */
input[type="checkbox"]:checked + input[type="hidden"] + .slider:before,
input[type="checkbox"]:checked + .slider:before {
  transform: translateX(26px);
}

/* Rounded sliders */
.slider.round {
  border-radius: 34px;
}

.slider.round:before {
  border-radius: 50%;
}
</style>

查看用法示例(只需将&lt;input type="checkbox" /&gt; 更改为@Html.CheckBoxFor):

<label class="switch">
    @Html.CheckBoxFor(model => model.IsEnabled)
    <div class="slider round">
    </div>
</label>

为了确保在回发之前在客户端检查复选框,您可以使用下面的 jQuery 代码:

// change event may modified to other events
$("#IsEnabled").change(function () {

    // check if checkbox is being checked
    // taken from /a/23007488 by Alexandru Chichinete
    if ($("#IsEnabled").is(":checked"))
    {
        // enable form submit
    }
});

演示示例:.NET Fiddle

参考资料:

Styling checkboxes in MVC 4

How can I apply a CSS style to Html.CheckBoxFor in MVC 5

@Html.checkboxfor - Get checkbox value using id

【讨论】:

  • 只需将 3 个相关类中的 +(相邻)选择器更改为 ~(兄弟姐妹)选择器(并且不需要 javascript)
  • AFAIK,相邻的选择器在这里只是最低限度(当然兄弟选择器也可以工作),并且 JS 部分仅在 OP 想要基于检查值提交表单时使用。
  • 非常感谢@tetsuya yamamoto 的解决方案!你摇滚!
  • 太棒了! @TetsuyaYamamoto
【解决方案2】:

这很简单,我已经在我的项目中实现了。 您只需要将复选框的值保留在 HiddenFor 中。

@Html.HiddenFor(model => model.IsEnabled, new{@id = "DelegateChkBox"})

然后在页面中显示您的切换按钮。例如,

 <td class="slider-td">
   <label class="switch">
    <input name="DelegateChkBox" id="IsEnabled" type="checkbox" value="true" 
      data-val-required="The IsEnabled field is required." data-val="true" 
      data-bind="checked: IsEnabled">
    <div class="slider round"></div>
   </label>
 </td>

所以现在当用户选中/取消选中复选框时,调用 jquery 方法并将值分配给 @Html.HiddenFor(..)。就是这样。

$('#IsEnabled').change(function(){
  if($(this).val()==true)
   {
    $('#DelegateChkBox').val(true);
   }
  else
   {
    $('#DelegateChkBox').val(false);
   }
})

请检查一次 if ($("this").is(":checked")) 而不是 if($(this).val()==true) 并相应地分配值。有点忙,无法检查我的代码:)

就是这样。现在,当您回发页面时,您已经为 IsEnabled 字段设置了值。

在 Get 方法中,您必须这样做。您只需要检查 HiddenFor() 的值并将该值分配给 js 的 pageload 事件中的 HTML Toggle 按钮。

$(function() {
 if($('#DelegateChkBox').val()== true)
  {
   $('#IsEnabled').prop("disabled", false);
  }
 else
  {
   $('#IsEnabled').prop("disabled", true);
  }
});

就是这样。请相应地更改 HTML。

【讨论】:

  • 感谢您的回复,我尝试使用包含的 HiddenFor() 但滑块不起作用(无法向左或向右滑动)。这就是我在添加 HiddenFor() 后苦苦挣扎的事情。无论如何,我会继续努力,非常感谢!
  • @Edward.K 这就是为什么我提到“请相应地更改 HTML”。我没有检查您的 HTML 切换按钮。你只需要检查你的切换按钮并按照我的步骤操作。这是非常简单的方法。工作后告诉我。
  • 感谢大家的贡献,使用 tetsuya yamamoto 解决方案解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多