2012-01-20 28 views
1

私はASP .NETで初心者です。親チェックボックス(User Type)を持つリピータを使用していますが、他のリピータコントロールを使用してUser Type Divisionを表示しています。リピーターのチェックボックスのチェック値は常にfalseです

​​は値がありません。私は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> 

CODE BEHIND

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プロパティで偽の状態にあるということです。 また、このページでは検証処理を正しく実行しません。私がFirebugコンソールの検証asp関数に書き込むときにも真の状態を返します。

どのような問題がありますか?事前

+0

サーバーコントロールのチェックボックスを使用する際の問題は何ですか? – deostroll

+0

私はautopostbackを使用しない場合、チェックボックスは偽に残っています。 – maxiperez

+0

は、同じIDで繰り返されるチェックボックスのようです。その問題を、入力フィールドにrunat = "server"を設定して削除することができます。 – deostroll

答えて

2

おかげで最後に私がonserverclick属性を追加するチェックボックスをするための簡単なHTMLのinputタグを使用します。

したがって、自動ポストバックは必要ありません。

ありがとうございます。

コメントの提案を受け入れます。

関連する問題