复选框在转发器中检查值为false

时间:2012-01-20 23:17:56

标签: c# asp.net repeater checkbox

我是ASP .NET的新手。我正在使用具有父复选框(User Type)的转发器,而在其他内部我使用其他转发器控件来显示User Type Division

因为Checkbox Microsoft ASP control没有值我使用html input type checkboxes,因为我需要使用javascript和jquery执行任何操作。

我的代码是下一个:

ASPX代码

<%@ Page Language="C#" AutoEventWireup="true" MasterPageFile="~/Admin/Admin.Master"
    CodeBehind="Editar.aspx.cs" Inherits="ELearning.Admin.Cursos.Editar" ValidateRequest="true" %>

<%@ Register Assembly="CKEditor.NET" Namespace="CKEditor.NET" TagPrefix="CKEditor" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    <title>Editar Curso</title>
    <script type="text/javascript" src="../../js/jquery-1.6.4.min.js"></script>
    <script type="text/javascript" src="../../js/funcionesGenerales.js"></script>
    <script type="text/javascript" src="../../ckeditor/ckeditor.js"></script>
    <script type="text/javascript" src="../../ckfinder/ckfinder.js"></script>
    <script type="text/javascript">
        window.onload = function () {
            //editor = CKEDITOR.replace('editor');
            CKFinder.setupCKEditor(null, '../../ckfinder/');
        }
    </script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <ajax:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnablePageMethods="true" />
    <h2 class="principalTitle">
        <asp:Label runat="server" ID="lblID"></asp:Label>
    </h2>
    <div>
        <h2>
            Titulo:
            <asp:TextBox runat="server" Width="500px" ID="txtTitulo"></asp:TextBox>
            <asp:RequiredFieldValidator ID="rfTitulo" CssClass="Validator" Text="El campo es obligatorio"
                runat="server" ControlToValidate="txtTitulo"></asp:RequiredFieldValidator>
            <%--<asp:RequiredFieldValidator ID="rfvTitulo" CssClass="Validator" Text="El campo es obligatorio"
                runat="server" ControlToValidate="txtTitulo" />--%>
            <asp:RegularExpressionValidator ID="maxLenTxtTitulo" ControlToValidate="txtTitulo"
                CssClass="Validator" ValidationExpression="(\s|.){0,256}$" Text="El titulo es demasiado largo. La longitud máxima es de 256."
                runat="server" />
        </h2>
    </div>
    <div>
        <h2>
            Objetivos:
            <asp:RequiredFieldValidator ID="rfvObjetivos" CssClass="Validator" Text="El campo es obligatorio"
                runat="server" ControlToValidate="heObjetivos" />
        </h2>
        <p>
            <CKEditor:CKEditorControl ID="heObjetivos" Width="862px" runat="server"></CKEditor:CKEditorControl>
        </p>
    </div>
    <div>
        <h2>
            Destinatarios:
            <asp:RequiredFieldValidator ID="rfvDestinatarios" CssClass="Validator" Text="El campo es obligatorio"
                runat="server" ControlToValidate="heDestinatarios" /></h2>
        <p>
            <CKEditor:CKEditorControl ID="heDestinatarios" Width="862px" runat="server"></CKEditor:CKEditorControl>
        </p>
    </div>
    <h2>
        Modalidad del curso
        <asp:RequiredFieldValidator ID="rfvModalidad" CssClass="Validator" Text="El campo es obligatorio"
            runat="server" ControlToValidate="heModalidad" />
    </h2>
    <p>
        <CKEditor:CKEditorControl ID="heModalidad" Width="862px" runat="server"></CKEditor:CKEditorControl>
    </p>
    <h2>
        Tipos de usuario que lo pueden ver</h2>
    <ul>
        <asp:Repeater ID="rptTipoUsuarios" runat="server">
            <ItemTemplate>
                <li class="listItems">
                    <input type="checkbox" id="chkTipoUsuario" class='<%# "chkTipoUsuario-" + DataBinder.Eval(Container.DataItem, "TipoUsuarioId") %>'
                        value='<%# DataBinder.Eval(Container.DataItem, "TipoUsuarioId") %>' runat="server"
                        onclick="seleccionarTodos($(this).is(':checked'), $(this).attr('id'))" />
                    <span id="nombreTipoUsuario" class='<%# "nombreTipoUsuario-" + DataBinder.Eval(Container.DataItem, "TipoUsuarioId") %>'>
                        <%# DataBinder.Eval(Container.DataItem, "Nombre") %>
                    </span>
                    <ul>
                        <asp:Repeater ID="rptDivisiones" runat="server">
                            <ItemTemplate>
                                <li class="listSubItems"><span class='<%# "chkDivision-" + DataBinder.Eval(Container.DataItem, "TipoUsuarioId")%>'>
                                    <input type='checkbox' id="chkDivision" class='<%# "chkDivision-class-" + DataBinder.Eval(Container.DataItem, "DivisionId")%>'
                                        value='<%# DataBinder.Eval(Container.DataItem, "DivisionId") %>' runat="server"
                                        onclick="sumarCheckeo($(this).attr('class'))" />
                                    <%# DataBinder.Eval(Container.DataItem, "Nombre") %>
                                </span></li>
                            </ItemTemplate>
                        </asp:Repeater>
                    </ul>
                </li>
            </ItemTemplate>
        </asp:Repeater>
    </ul>
    <div>
        <h2>
            <span style="display: none">
                <asp:TextBox ID="contadorCheckeos" ClientIDMode="Static" Text="0" runat="server"></asp:TextBox>
                <asp:CheckBox ID="chkAuxOtros" ClientIDMode="static" runat="server" />
            </span>
            <asp:RegularExpressionValidator CssClass="Validator" ID="revChkQuantity" ControlToValidate="contadorCheckeos"
                runat="server" Text="Debe seleccionar al menos 1 division" ValidationExpression="[1-9]*\.?[0-9]*[1-9]">
            </asp:RegularExpressionValidator>
        </h2>
    </div>
    <div>
        <asp:Button runat="server" ID="btnSubmit" Text="Actualizar"></asp:Button>
    </div>
</asp:Content>

代码背后

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

namespace ELearning.Admin.Cursos
{
    public partial class Editar : System.Web.UI.Page
    {
        private ELearningContextDataContext db;
        private int cursoId;
        private List<DataObject.CursoDivision> cursoDivisiones;

        protected void Page_Load(object sender, EventArgs e)
        {
            DeclararHandlers();
            InicializarConexionDB();
            ((Admin)this.Master).PermitirORedireccionarAdmin();
            Int32.TryParse(Request.QueryString["id"], out cursoId);
             if(!((from p in db.Cursos where p.CursoId == cursoId select p).ToArray().Length > 0))
                 Response.Redirect("Default.aspx");

            if (!Page.IsPostBack)
            {
                CargarColecciones();
                CargarDatos();
            }
        }

        protected void CargarColecciones()
        {
            CargarTiposDeUsuario();
            CargarDivisiones();
        }

        protected void CargarTiposDeUsuario()
        {
            var tipoUsuarios = DataObject.TipoUsuario.ObtenerTodos(db, false);
            rptTipoUsuarios.DataSource = tipoUsuarios;
            rptTipoUsuarios.DataBind();
        }

        protected void CargarDivisiones()
        {
            var divisiones = DataObject.Division.ObtenerTodos(db);
        }

        protected void InicializarConexionDB()
        {
            db = new ELearningContextDataContext();
        }

        protected void DeclararHandlers()
        {
            btnSubmit.Click += new EventHandler(btnSubmit_Click);
            rptTipoUsuarios.ItemDataBound += new RepeaterItemEventHandler(rptTipoUsuarios_ItemDataBound);
        }

        protected void rptTipoUsuarios_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            RepeaterItem ri = (RepeaterItem)e.Item;

            if (ri.ItemType == ListItemType.Item ||
            ri.ItemType == ListItemType.AlternatingItem)
            {
                Repeater rptDivisiones = (Repeater)ri.FindControl("rptDivisiones");
                rptDivisiones.ItemCreated += new RepeaterItemEventHandler(rptDivisiones_ItemCreated);
            }
        }

        protected void rptTipoUsuarios_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                var chk = (System.Web.UI.HtmlControls.HtmlInputCheckBox)e.Item.FindControl("chkTipoUsuario");
                chk.ID = "chkTipoUsuario-" + e.Item.ItemIndex;
                if (string.Compare(((ELearning.TipoUsuario)(e.Item.DataItem)).Nombre.ToLower(), "otros") == 0)
                {
                    //Ver si se checkeo
                    //Se puede crear un enum para los tipo de usuario y las divisiones
                    Int32.TryParse(Context.Request.QueryString["id"], out cursoId);
                    var query = from p in db.CursoDivisiones where p.CursoId == cursoId && p.DivisionId == 8 select p;

                    if (query.ToArray().Length > 0)
                    {
                        chk.Checked = true;
                        chkAuxOtros.Checked = true;
                    }
                }
                //((System.Web.UI.HtmlControls.HtmlInputCheckBox)chk).Checked = false;
                Repeater ChildRepeater = (Repeater)e.Item.FindControl("rptDivisiones");
                LlenarRepeaterInterno(ChildRepeater, ((ELearning.TipoUsuario)e.Item.DataItem).TipoUsuarioId);
            }
        }

        protected void LlenarRepeaterInterno(Repeater childRepeater, int tipoUsuarioId)
        {
            /*SELECT * FROM Divisiones INNER JOIN TipoUsuarios as tu on tu.TipoUsuarioId =      Divisiones.TipoUsuarioId WHERE Divisiones.TipoUsuarioId = 1 AND tu.Nombre != 'Otros'*/

            var query = (from p in db.Divisiones join q in db.TipoUsuarios on p.TipoUsuarioId equals q.TipoUsuarioId where p.TipoUsuarioId == tipoUsuarioId && string.Compare(q.Nombre.ToLower(), "Otros".ToLower()) != 0 select p).Distinct();

            childRepeater.DataSource = query;
            childRepeater.DataBind();
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            try
            {
              //CODE FOR SUBMIT

            }
            catch (Exception ex)
            {

                //Manejar excepcion
            }
        }

        protected List<DataObject.CursoDivision> CrearCursoDivision()
        {

            try
            {
                List<DataObject.CursoDivision> divisiones = new List<DataObject.CursoDivision>();
                int divisionId;
                int tipoUsuarioId;
                foreach (RepeaterItem item in rptTipoUsuarios.Items)
                {

                    var checkboxTipoUsuario = (System.Web.UI.HtmlControls.HtmlInputCheckBox)item.FindControl("chkTipoUsuario");
                    Int32.TryParse(checkboxTipoUsuario.Value, out tipoUsuarioId);
                    if (!DataObject.TipoUsuario.esOtros(db, tipoUsuarioId))
                    {
                        Repeater rptDivisiones = (Repeater)item.FindControl("rptDivisiones");
                        if (rptDivisiones != null)
                        {
                            foreach (RepeaterItem itemDivision in rptDivisiones.Items)
                            {
                                var checkbox = (System.Web.UI.HtmlControls.HtmlInputCheckBox)itemDivision.FindControl("chkDivision");
                                if (checkbox.Checked)
                                {
                                    Int32.TryParse(checkbox.Value, out divisionId);
                                    divisiones.Add(new DataObject.CursoDivision(0, divisionId));
                                }
                            }
                        }
                    }
                    else
                    {
                        if (chkAuxOtros.Checked)
                        {
                            var query = db.Divisiones.Single(q => q.TipoUsuarioId == tipoUsuarioId);
                            divisiones.Add(new DataObject.CursoDivision(0, query.DivisionId));
                        }
                    }
                }

                return divisiones;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        protected void CargarDatos()
        {
            try
            {
                Int32.TryParse(Context.Request.QueryString["id"], out cursoId);
                //CKFinder.FileBrowser _fileBrowser = new CKFinder.FileBrowser();
                //_fileBrowser.BasePath = "/ckfinder/";
                //_fileBrowser.SetupCKEditor(null);

                if (!Page.IsPostBack && cursoId != 0)
                {
                    var curso = db.Cursos.Single(p => p.CursoId == cursoId);

                    lblID.Text = string.Format("Editando Curso ID #{0}", cursoId.ToString());
                    txtTitulo.Text = curso.Titulo;
                    heObjetivos.Text = curso.Descripcion;
                    heModalidad.Text = curso.Modalidad;
                    heDestinatarios.Text = curso.Destinatario;
                    var query = from q in db.CursoDivisiones
                                where q.CursoId == cursoId
                                select q.DivisionId;

                    string divisionesSeleccionadas = string.Join(",", query.ToArray());

                    Page.ClientScript.RegisterStartupScript(GetType(), "JSScript", string.Format("tildar('{0}')", divisionesSeleccionadas), true);

                }
                else
                {
                    if (cursoId == 0)
                        Response.Redirect("Default.aspx");
                }
            }
            catch (Exception ex)
            {
                //REdirige hacia pagina de error
            }
        }
    }
}

我的问题是,Checked属性中的父复选框永远处于false状态。 此页面也不能正确执行验证操作。当我在Firebug控制台中编写验证时,asp函数也会返回true状态。

哪个可能是问题?

提前致谢

1 个答案:

答案 0 :(得分:1)

最后,我使用一个简单的html输入标签来添加onserverclick属性。

因此没有必要使用autopostback。

谢谢,对不起。

接受评论中的建议。