ASP Javascript RadioButton включить отключить не включены в постбэк AJAX - PullRequest
2 голосов
/ 09 августа 2011

Вот проблема. У меня есть группа радиокнопок (две радиокнопки).

Эти ребята изначально отключены. Когда пользователь нажимает флажок, я динамически включаю радиокнопки в javascript, устанавливая rbtn.disabled = false; и делаю то же самое для своего родителя (элемента span), чтобы он правильно работал в IE. Проблема в том, что эти динамически включенные радиокнопки не возвращаются при обратной передаче (я вижу rbtn.Checked == false на стороне сервера, а request.form не содержит правильного значения).

Почему это происходит? Есть ли другое исправление, кроме обходного пути со скрытыми полями?

Ожидаемый ответ описывает политику обратной передачи, почему / как решает, какие поля включены в обратную передачу, и исправляет эту проблему.

Ответы [ 4 ]

1 голос
/ 22 августа 2011

Я знаю, что следующий код не аккуратен, но он выполняет свою работу (если я правильно понимаю проблему). Я копирую / вставляю сюда все содержимое файла, чтобы вам было легче с ним играть. Просто создайте веб-форму с именем WebForm1 и вставьте ее;

в файле .aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <script type="text/javascript">
    function enable(sender) {
        if (sender.checked) {
            document.getElementById('<%= RadioButton1.ClientID %>').removeAttribute('disabled');
            document.getElementById('<%= RadioButton2.ClientID %>').removeAttribute('disabled');
        }
        else {
            document.getElementById('<%= RadioButton1.ClientID %>').disabled = true;
            document.getElementById('<%= RadioButton2.ClientID %>').disabled = true;
        }
    }
    </script>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:CheckBox ID="CheckBox1" runat="server" onclick="enable(this)" />

    <asp:RadioButton ID="RadioButton1" runat="server" Text="1" 
         Enabled="false" />
    <asp:RadioButton ID="RadioButton2" runat="server" Text="2" 
         Enabled="false" />

    <asp:Button ID="Button1" runat="server" Text="Button" 
        onclick="Button1_Click1" />

    <asp:Label ID="Label1" runat="server" Text="" />
    </form>
</body>
</html>

в .aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        static readonly string GROUP_NAME = "RadioButtonGroup";
        protected void Page_Load(object sender, EventArgs e)
        {
            RadioButton1.GroupName = GROUP_NAME;
            RadioButton2.GroupName = GROUP_NAME;
            if (IsPostBack)
            {
                if (CheckBox1.Checked)
                {
                    RadioButton1.Enabled = true;
                    RadioButton2.Enabled = true;
                    if (Request.Params[GROUP_NAME] == RadioButton1.ID)
                    {
                        RadioButton1.Checked = true;
                    }
                    else if (Request.Params[GROUP_NAME] == RadioButton2.ID)
                    {
                        RadioButton2.Checked = true;
                    }
                }

            }
        }

        protected void Button1_Click1(object sender, EventArgs e)
        {
            if (Request.Params[GROUP_NAME] == RadioButton1.ID)
            {
                Label1.Text = "1 is selected";
                if (Request.Params[GROUP_NAME] == RadioButton2.ID)
                {
                    Label1.Text += "and 2 is selected";
                }
            }
            if (Request.Params[GROUP_NAME] == RadioButton2.ID)
            {
                Label1.Text = "2 is selected";
            }
        }
    }
}
1 голос
/ 19 августа 2011

Перед выполнением submit удалите атрибут disabled из переключателей следующим образом:

document.getElementById("rbtnID").removeAttribute("disabled");

Обратите внимание, что removeAttribute может содержать ошибки в IE, и IE также реализует второй атрибут чувствительности к регистру, см. Статью MSDN .

Существует также removeAttributeNode, который удаляет весь узел атрибута, но он принимает в качестве параметра node вместо имени.

var disabledNode = element.getAttributeNode('disabled');
element.removeAttributeNode(disabledNode);

Итак, сделайте это, и дайте мне знать, как они играют!

0 голосов
/ 22 августа 2011

Перед отправкой страницы установите свойство disabled кнопок радио на false. В коде позади прочитайте значение переключателя, используя Request.Form["radioButtonName"]. Это даст вам значение переключателя, который отмечен.

Пример:

Допустим, имя списка переключателей: radioButton1 с двумя переключателями. Когда он рендерится на странице, переключатели будут иметь одно и то же имя, скажем ctl0$radioButton1. В любом случае это зависит от вложенности вашей страницы. Вы можете получить это имя используя radioButton.UniqueID.

Когда страница отправляется через какое-либо действие на странице, выполните приведенный ниже javascript, который установит для свойства disabled радио-кнопки значение false.

document.getElementById("radioButton1ItemCliendId").disabled = false;

//If you want to check this radio button then
document.getElementById("radioButton1ItemCliendId").checked = true;

В обработчике события обратной передачи на стороне сервера вы должны использовать Request.Form[radioButton1.UniqueID], чтобы получить значение этого переключателя. Это даст значение переключателей, которое проверено.

0 голосов
/ 15 августа 2011

У меня не было возможности проверить это самому, но я предполагаю (если вы используете ASP.net), что вы отключили переключатели с помощью кода ASP.net на стороне сервера, т.е. через серверный элемент управления.

А затем их отключить с помощью javascript?

Я думаю, что, возможно, серверная сторона все еще считает, что они отключены - я не на 100% почему, не копая дальше (что-то в жизненном цикле страницы)где-то).

Возможно, быстрое решение было бы вместо того, чтобы отключать переключатели через серверную часть, вместо того, чтобы отключать их в javascript при загрузке страницы?т.е. делать отключение и включение в javscript.

...