我是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状态。
哪个可能是问题?
提前致谢
答案 0 :(得分:1)
最后,我使用一个简单的html输入标签来添加onserverclick属性。
因此没有必要使用autopostback。
谢谢,对不起。
接受评论中的建议。