Razor的Tri state复选框

时间:2013-07-11 14:51:39

标签: asp.net-mvc-4 razor checkbox user-controls

我需要一个复选框来返回可以为空的bool值。我该怎么办? Razer引擎有三态复选框吗? 我发现了this个问题,但该链接无效。

2 个答案:

答案 0 :(得分:3)

您可以为此类创建TriState类,自定义ModelBinder,以及相应的显示/编辑模板。

TriState类应该有一个属性来存储当前状态的表示形式,并不重要:例如enumint可以是bool? -1,0或1,或者可以为空的bool ModelBinder

显示模板应该只显示状态。即它可以显示状态的不同图像,也许是相关的“标签”。

编辑模板应显示状态,并有一个脚本,允许在单击时旋转3个状态。

例如,编辑/显示模板可以实现为带有文本的跨度,该文本将用作状态的标签,并且可以具有不同的CSS样式以将图像显示为跨度的背景图像。这样可以轻松地在服务器和客户端脚本中更改图像。

对于编辑模板,范围还应包含:

  • 一个隐藏字段,以自定义TriState可以恢复的方式存储值(即格式化为字符串以存储值,并解析字符串以恢复它)
  • 一个脚本,用于处理跨度的click事件并更改状态,即更新隐藏字段中的值,以及显示相应背景图像的样式。

所以你需要:

  • ModelBinder class
  • TriState课程的自定义{{1}}。 Look hereor here
  • 用于显示/编辑的模板。阅读此博客:Brad Wilson: ASP.NET MVC 2 Templates
  • 用于显示不同图像的Syles(定义背景图像和填充,以便文本不会覆盖图像)。此外,样式可以更改可点击版本(编辑器模板)中的光标,并可能在悬停时更改显示,以向用户提供该元素可单击的提示。
  • 更改状态的客户端脚本(仅适用于编辑器模板)。对于这个脚本,我建议添加一个“data-”属性并以不引人注意的方式附加它。见my answer to this question

您可以通过在类中实现三个附加属性来存储要显示三种状态的标签来改进这一点。此值可以作为范围中的额外“data-”属性添加,以便客户端脚本可以根据当前状态更改标签。

答案 1 :(得分:0)

我在dotnet/aspnetcore githubhere上发布了.NET Core 3.1+的可能解决方案

这里是fiddle

我在.NET core 3.1+中实现了这个简单的组件。 这是fiddle

css来自引导程序,需要显示一个空框,一个选中的框和一个“满”框以指示状态0,1,-1(可以轻松更改这些值):

<style>
    [class^="icon-"], [class*=" icon-"] { display: inline-block; width: 14px; height: 14px; margin-top: 1px; *margin-right: .3em; line-height: 14px; vertical-align: text-top; background-image: url(/img/glyphicons-halflings.png); background-position: 14px 14px; background-repeat: no-repeat; }
    .bootstrap-checkbox { display: inline-block; position: relative; width: 13px; height: 13px; border: 1px solid #000; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }
        .bootstrap-checkbox i { position: absolute; left: -2px; top: -3px; }
    .icon-stop { background-position: -312px -72px; }
    .icon-check { background-position: -288px 0px; }
</style>

这是发光的部分:

<div @ref=checkboxElement class="bootstrap-checkbox" @onclick="(e) => OnClick(e)"><i class="@ImgClass"></i></div>@Description

@code {

    public ElementReference checkboxElement { get; set; }
    [Parameter]
    public string Description { get; set; }
    [Parameter]
    public bool? Checked { get; set; }
    public string ImgClass { get; set; }
    public int Value { get; set; }

    protected override void OnInitialized()
    {
        Value = Checked switch { null => -1, true => 1, false => 0 };
        ImgClass = Value switch { -1 => "icon-stop", 1 => "icon-check", _ => "" };
    }

    public void OnClick(MouseEventArgs e)
    {
        switch (ImgClass)
        {
            case "":
                ImgClass = "icon-check";
                Value = 1;
                break;
            case "icon-check":
                ImgClass = "icon-stop";
                Value = -1;
                break;
            case "icon-stop":
                ImgClass = "";
                Value = 0;
                break;
        }
    }
}