【问题标题】:Unchecking a radio button with Jquery使用 Jquery 取消选中单选按钮
【发布时间】:2017-08-14 13:35:06
【问题描述】:

我有几个RadioButtonFor(剃须刀),我正在尝试制作一个 JQuery 脚本,当您检查另一个按钮时,它会取消选中其他按钮。

我有一个模型,其中包含要传递给 Html Helper 和打印机名称的布尔数组:

public class Mymodel
{    
    public List<PrinterModel> printers { get; set; }
    public bool noDefault { get; set; }
}

我的PrinterModel如下:

public class Printermodel
{
    public bool selected { get; set; }
    public string printerName { get; set; }
}

然后在我看来,:

@using (Html.BeginForm()
{
<div class="form-group">
    for (var i = 0; i < Model.printers.Count(); i++)
    {
        @Html.RadioButtonFor(m => m.printers[i].selected, new { @class = "default" });
        @Html.Label(Model.printers[i].printerName);
        <br/>
    }
    @Html.RadioButtonFor(m=>m.noDefaultRadio, new { @class = "noDefault", @checked= "checked" });
    @Html.Label("No default printer");
</div>
}

我知道我可以在 JQuery 中使用.prop('checked', false) 取消选中单选框,所以我在第一次播放时尝试取消选中默认按钮:

$('.default').change(function () {
    if ($('.default:checked').length > 0) {
        $('.noDefault').prop('checked', false);
    }
    else {
        $('.noDefault').prop('checked', true);
    }
});

这什么也没做,但对复选框有效,为什么?

另外,@checked="checked" 不会默认选中RadioButtonFor,我也尝试过@checked = true,它也不起作用。

有什么想法吗?

编辑当尝试按照建议使用 name="default" 时,我在导航器中检查页面时看到以下输入:

<input data-val="true" id="printers_0__primarySelected" name="printers[0].primarySelected" type="radio" value="{ disabled = disabled }"

【问题讨论】:

  • 试试.prop('selected', false) 单选按钮
  • 如果我没记错的话,单选按钮是用来一次选择一个的。也许您缺少任何分组?
  • 不知道,分组是什么意思?此外,与 selected 相同的脚本不会做任何事情
  • 你不应该把radiobuttonsfor放在一个div或一个表单中吗?
  • @Louis-RochTessier 抱歉忘了准确地说它在Html.BeginForm 和div 中

标签: c# jquery asp.net-mvc razor radiobuttonfor


【解决方案1】:

你能把单选按钮变成组的一部分吗?您尝试执行的操作听起来像是默认行为。

您能否在 RadioButtonFor 调用中将 name = "printerGroup"(或类似名称)添加到您的 HTML 属性中以将它们组合在一起?

更新:

退后一步,听起来您想要选择 1 个单选按钮。提交后,您应该希望将 selectedId 或某些标识符传递回您的控制器。我希望进行以下更改。

型号

public class PrinterModel   
    {
        public int Id { get; set; }
        public string printerName { get; set; }
    }

public class MyModel
    {
        public List<PrinterModel> printers { get; set; } = new List<PrinterModel>();
        public string selectedId { get; set; } //This will be the id of what gets selected
    }

查看

@using (Html.BeginForm())
{
    <div class="form-group">
        @for (var i = 0; i < Model.printers.Count; i++)
        {
            @Html.RadioButtonFor(m => Model.selectedId, Model.printers[i].Id, new { name = "test" });
            @Html.Label(Model.printers[i].printerName);
            <br />
        }
        @Html.RadioButtonFor(m => Model.selectedId, "0", new { name = "test" })
        @Html.Label("No default printer")
    </div>
}

在您的控制器中,您可以获取 selectedId 并对其执行某些操作,如果传入 0,则将是默认值(根据需要更改)。

【讨论】:

  • 我确实输入了@class="default",如果这是你的意思?不确定我是否完全理解您提议的目的?
  • 当单选按钮共享一个通用名称时,它们被视为一个组。当组合在一起时,一次只能选择一个单选按钮。因此,如果您的所有单选按钮都在一个组中,那么一次只能选择 1 个,请将 name = "printerGroup" 添加到调用中,看看是否符合您的要求。
  • 我明白了,所以我尝试了:@Html.RadioButtonFor(m =&gt; m.printers[i].primarySelected, new { @disabled = "disabled", Name = "default"}); 但这不起作用
  • 所有单选按钮都需要同名,能否确保使用小写名称(name = "printerGroup")?
  • 还是不成功。当我检查我的代码时,我确实看到了这一点:&lt;input name="printer[0].selected" /&gt; 并且每个循环都会发生变化,所以问题可能来自表达式 m =&gt; m.printers[i].selected ?不知道如何解决这个问题,我虽然你必须在这里放一个布尔值,而不是一个名字?
【解决方案2】:

使用click 而不是change 事件,因为一旦检查无线电,change 事件将不会再次触发。

$('.default').click(function () {
    if ($('.default:checked').length > 0) {
        $('.noDefault').prop('checked', false);
    }
    else {
        $('.noDefault').prop('checked', false);
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Check .default <input type="radio" name="one" class="default" /> <br/>
Check .noDefault <input type="radio" name="two" class="noDefault" checked /> <br/>

【讨论】:

  • 这也不起作用:s 我认为我的脚本是错误的。
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 2011-10-26
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多