ASP.NET MVC checkbox问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET MVC checkbox问题相关的知识,希望对你有一定的参考价值。

<input id='Checkbox1' disabled='disabled' checked='' Value='" + item.F_m_power_id + "' name='R' type='checkbox' />
[HttpPost]
public ActionResult Index(FormCollection fcom)

string[] s = fcom.GetValues("R");//得到被选中的值
return View();

为什么把checkbox属性 disabled='disabled'就不能获取值了,我想不能用而且还获取值有什么办法吗?

参考技术A disabled 和readonly有相同的地方也是可以锁定这个控件用户不能改变他的值,但是disabled的更彻底一些,他是要使你完全不能使用他,包括改变他的背景颜色,如果是checkbox则不能选中他。追问

谢谢你回答!~但是不对劲啊!readonly 只对文本框管用啊

追答

我也是上网找到的. readonly 对不对多选我也不是很清楚..

参考技术B 做一个同name的隐藏项,通过隐藏项来取得追问

我的意思是如何上checkbox 只显示,比如选中了,就不能在点了。或者没有选中也不能点

追答

disabled属性控制禁用,用同name的隐藏项来负责取值

本回答被提问者采纳

取消选中时 ASP.NET CheckBox 不会触发 CheckedChanged 事件

【中文标题】取消选中时 ASP.NET CheckBox 不会触发 CheckedChanged 事件【英文标题】:ASP.NET CheckBox does not fire CheckedChanged event when unchecking 【发布时间】:2011-03-28 07:03:21 【问题描述】:

我在 ASP.NET 内容表单上有一个 CheckBox,如下所示:

<asp:CheckBox runat="server" ID="chkTest" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged" />

在我后面的代码中,我有以下方法:

protected void chkTest_CheckedChanged(object sender, EventArgs e)


当我在浏览器中加载页面并单击 CheckBox 时,它变为选中状态,页面回发,我可以看到 chkTest_CheckedChanged 被调用。

当我再次单击 CheckBox 时,它变为未选中状态,页面回发,但 chkTest_CheckedChanged 未被调用。

该过程是可重复的,因此一旦取消选中 CheckBox,选中它就会触发事件。

我在 Web.Config 中禁用了 View State,启用 View State 会导致此问题消失。在视图状态保持禁用状态时,我可以做些什么来触发可靠的事件?

更新: 如果我在服务器标签上设置Checked="true",当取消选中复选框时,情况会随着事件触发而逆转,但反之则不然。

更新 2: 我已经在我的页面中覆盖了OnLoadComplete,从那里我可以确认Request.Form["__EVENTTARGET"] 已正确设置为我的CheckBox 的ID。

【问题讨论】:

我也遇到过这种情况,为什么会这样?任何信息?这条隧道尽头有什么灯(不会让我撞倒)? 如果您可以发布 Page_Load 事件的代码会有所帮助 Page_Load 事件中没有任何内容。所有代码都在原帖中。 【参考方案1】:

要触发 CheckedChanged 事件,请为 CheckBox 设置以下属性,AutoPostBack 属性应为 true,并且应具有默认值,选中 false 或 true。

AutoPostBack="true" Checked="false"

【讨论】:

接受的答案对于这个简单的问题来说太过分了。这个答案应该是公认的答案。 我完全同意@MatheusRocha。我对接受的答案感到非常沮丧,并且肯定不会尝试。这个答案真的让我免于改变我的设计。 好人!我同意这应该是公认的答案。当然对我有用! 这需要是这种情况下公认的答案。【参考方案2】:

实现将Checked 属性存储在ControlState 而不是ViewState 的自定义CheckBox 可能会解决该问题,即使复选框具有AutoPostBack=false

与 ViewState 不同,ControlState 不能被禁用,可用于存储对控件行为至关重要的数据。

我现在没有要测试的 Visual Studio 环境,但应该是这样的:

public class MyCheckBox : CheckBox

    private bool _checked;

    public override bool Checked  get  return _checked;  set  _checked = value;  

    protected override void OnInit(EventArgs e)
    
        base.OnInit(e);
        //You must tell the page that you use ControlState.
        Page.RegisterRequiresControlState(this);
    

    protected override object SaveControlState()
    
        //You save the base's control state, and add your property.
        object obj = base.SaveControlState();

        return new Pair (obj, _checked);
    

    protected override void LoadControlState(object state)
    
        if (state != null)
        
            //Take the property back.
            Pair p = state as Pair;
            if (p != null)
            
                base.LoadControlState(p.First);
                _checked = (bool)p.Second;
            
            else
            
                base.LoadControlState(state);
            
        
    

更多信息here。

【讨论】:

感谢这就像魔术一样。我不敢相信我一直在 .Net 中工作,直到现在我从未遇到过这个问题。这也适用于动态创建的复选框,只需将它们注册为“MyCheckBox”实例而不是标准实例即可。 加油-谢谢。为什么复选框不能开箱即用我不知道。【参考方案3】:

它不会触发,因为禁用了视图状态,服务器代码不知道该复选框之前已选中,因此它不知道状态已更改。据 asp.net 所知,在回发之前未选中复选框控件,并且仍处于未选中状态。这也解释了您在设置 Checked="true" 时看到的反向行为。

【讨论】:

一年后我又回来了,所以我不记得我当时的想法是什么,但你说得对,页面生命周期确实会导致这种效果。我想我可能已经预料到了,因为 __EVENTTARGET 被设置到我的复选框中,ASP.NET 可能足够聪明地意识到它已经改变了。【参考方案4】:

我不确定,但我猜我的解决方案仅适用于 .NET Framework 4.0:

使用ViewStateMode = "Disabled" 禁用EnableViewState="false" 的视图状态。除了您可以保存本地视图状态之外,这将警告相同的行为。

因此,在您的复选框上,设置属性ViewStateMode = "Enabled",问题就解决了,无需实现自定义复选框。

【讨论】:

【参考方案5】:

这是一篇旧帖子,但我不得不分享我的简单解决方案,以帮助其他搜索此问题的人。

解决方法很简单:开启 AutoPostBack。

        <asp:CheckBox id="checkbox1" runat="server"
                AutoPostBack="True" //<<<<------
                Text="checkbox"
                OnCheckedChanged="knowJobCBOX_CheckedChanged"/>

【讨论】:

【参考方案6】:

我想稍微整理一下,所以我花了一点时间来测试解决方案。

joshb 对 CheckBox 行为方式的解释是正确的。

由于我不知道我去年是如何解决这个问题的,或者即使我做到了(我不记得我当时正在检查什么),我已经制定了一个简单的解决方案/解决方法。

public class CheckBox2 : CheckBox

    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
    
        bool isEventTarget = postCollection["__EVENTTARGET"] == UniqueID;
        bool hasChanged = base.LoadPostData(postDataKey, postCollection);
        hasChanged = hasChanged || isEventTarget;
        return hasChanged;
    

如果您现在在您的页面中注册 CheckBox2 并使用它来代替您的标准 CheckBoxes,您将在禁用 ViewState 并启用 AutoPostBack 的情况下触发 CheckedChanged 事件。

它的工作方式是允许普通 CheckBox 进行验证和更改检查,然后执行额外的检查以查看它是否是导致回发的事件的目标。如果是目标,则返回 true 以告知框架引发 CheckedChanged 事件。

编辑: 请注意,这只解决了 CheckBox 上 AutoPostBack 的问题。如果从其他任何东西(例如按钮)调用 PostBack,CheckedChanged 事件仍然会出现观察到的问题。

【讨论】:

可能对 LoadPostData 没有调用***.com/questions/3211200/…的情况有所帮助【参考方案7】:

我遇到了同样的问题。折腾了好久,终于解决了。

在我的情况下,Checkbox 默认被禁用:

<asp:CheckBox ID="chkActive" runat="server" Enabled="false"/>

原来ViewState 没有为禁用或不可见控件加载。 所以删除Enabled="false"Visible="false" 它将按预期工作。当然,ViewState 不应该被禁用。

【讨论】:

【参考方案8】:

另外:检查 JavaScript 控制台中的任何错误

我遇到了与 OP 描述的完全相同的问题,只是它只发生在 Safari 中(checkbox 在 Chrome 和 Firefox 中运行良好)。在检查 JavaScript 控制台时,我发现了一个错误的 jQuery 选择器引发的错误。

在我的情况下,我有 $('a[id*=lbView'),它缺少一个结束 ]。这会在 Safari 中引发错误,但令人惊讶的是,在 Chrome 和 Firefox 中都没有。

【讨论】:

【参考方案9】:

超级简单的答案是为那个控件设置ViewState

只需将EnableViewState="true" 添加到复选框标记中的AutoPostBack="true" 属性即可。

【讨论】:

【参考方案10】:

CheckBox 的“Checked”属性的默认值为false(表示取消选中)。因此,当您选中/取消选中 CheckBox 时,它会与 Checked Property 进行比较。

如果与 Checked Property 不匹配,ASP 会触发 OnCheckedChanged 事件。 如果它与 Checked 属性匹配,则不会触发 OnCheckedChanged 事件。

所以,为了让 ASP 在取消选中时触发OnCheckedChanged 事件,它必须知道原始值,以便与用户的值进行比较并触发事件。

通过在asp:CheckBox 中添加data-originalValue='&lt;%# Eval("ValueFromCodeBehind") %&gt;' 属性将能够触发OnCheckChanged 事件,因为ASP 现在可以知道它以前的值。这样当我们更改它时,即使我们取消选中,ASP 也会触发 OnCheckChanged 事件。

【讨论】:

以上是关于ASP.NET MVC checkbox问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC ajax数组,模型绑定问题。

ASP.NET MVC 复选框组

asp.net mvc 中模型验证如何处理数组呢?

ASP .Net MVC,复选框问题!

用于引导切换的 asp.net 核心 mvc 标签助手

单击复选框时 ASP.NET MVC 提交表单