javascript - 无法在继承的 ASP.Net RadioButtonList 上使用 Javascript 清除所选项目

标签 javascript asp.net postback viewstate radiobuttonlist

我需要从自定义 RadioButtonList 中清除所选项目,但它在回发时不起作用。

我有一个继承自 ASP.Net RadioButtonList 的自定义控件。 当控件具有初始选择的值时,如果我调用客户端函数来清除所选项目然后进行回发,则会重新选择最初选择的项目。

如果我使用 ASP.Net RadioButtonList,在回发时,所选项目将被清除,这样就可以工作,但是简单地继承内置项目的类会失败

简化形式:

<div>    
<a href="javascript:Clear()">Clear</a>
</div>
<h1>
    <asp:Label Text="ready..." runat="server" ID="lblTest" /></h1>
<script type="text/javascript">
    function ChangeValue() {
        var obj = document.getElementById('test_1');
        obj.checked = true;
    }

    function Clear() {
        var obj = document.getElementById('test_0');
        obj.checked = false;

        obj = document.getElementById('test_1');
        obj.checked = false;
    }
</script>
<asp:Button ID="button" runat="server" onclick="button_Click" />

在代码隐藏中

public class MyRadio : RadioButtonList
{

}

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    MyRadio test = new MyRadio();
    test.ID = "test";
    test.Items.Add(new ListItem("First", "First"));
    test.Items.Add(new ListItem("Second", "Second"));

    if (!Page.IsPostBack)
        test.SelectedValue = "Second"; 

    this.Form.Controls.Add(test);        
}
protected void button_Click(object sender, EventArgs e)
{
    RadioButtonList rl = this.FindControl("test") as RadioButtonList;
    if (rl.SelectedItem == null)
        lblTest.Text = "No selected item";
    else
        lblTest.Text = rl.SelectedItem.Value + " - " + rl.SelectedItem.Text;
}

如果我将“test”更改为 RadioButtonList 并在页面中单击“清除”然后发回,我会看到文本“No selected item”,这就是我需要的;这是在 .Net 4 上运行的,也在 .Net 4.5 上尝试过,但有相同的错误。

最佳答案

解决方案是在派生类中实现 IPostBackDataHandler。这是从一位在 MSDN 上找到它的 friend 那里得到的

public class MyRadio : RadioButtonList, System.Web.UI.IPostBackDataHandler
{
bool System.Web.UI.IPostBackDataHandler.LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
    foreach (ListItem item in this.Items)
    {
        item.Selected = false;
    }

    return this.LoadPostData(postDataKey, postCollection);
}

void System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
{
    this.RaisePostDataChangedEvent();
}

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    Page.RegisterRequiresPostBack(this);
}
}

关于javascript - 无法在继承的 ASP.Net RadioButtonList 上使用 Javascript 清除所选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440187/

相关文章:

javascript - 动画 chop <p> 中的多行文本

asp.net - 为什么我的 asp.net 页面会被同步访问?

javascript - 尝试从外部 JS 文件调用函数

c# - 带有更新面板的异步任务?

asp.net - 跨多个回发存储对象的方法

javascript - jQuery scrollTop() 不适用于 Firefox 中的 'body' 元素

javascript - Ember.js - 调用父模型 Hook 为子模型加载数据

javascript - meteor :在不注销的情况下更改用户密码?

c# - 从 Web 应用程序(EF、ASP.NET Identity、Azure)中删除注册并从 DB 中注册用户

c# - ASP :Button click event inside update panel not firing