Pregunta

Tengo la siguiente situación:

Un usuario definirá un cierto filtro en una página, y en la devolución de datos consultaré la base de datos usando ese filtro y devolveré un montón de registros coincidentes al usuario, cada uno con una casilla de verificación al lado, para que pueda elegir si desea actuar en cada uno de esos registros.

En ASP / PHP clásico puedo generar muchos controles llamados " chk __ * " y luego, en la devolución, revise todas las entradas de $ POST buscando las que tienen el prefijo " chk " ;.

¿Cuál es la mejor manera de hacer esto en ASP.Net 2.0?

Puedo hacerlo fácilmente implementando un repetidor con una plantilla que contiene la casilla de verificación, enlazar el repetidor a un conjunto de datos y luego en la segunda devolución de datos, simplemente hago:

For Each it As RepeaterItem In repContacts.Items
    Dim chkTemp As CheckBox = DirectCast(it.FindControl("cbSelect"), CheckBox)
    If chkTemp.Checked Then

    End If
Next

Sin embargo, esto tiene la desventaja leve de darme un estado de vista ENORME, lo cual es realmente malo porque el cliente necesitará volver a cargar todo el estado de vista en el servidor, y estas personas probablemente usarán mi sitio a través de una conexión deficiente.

¿Alguna otra idea? (También puedo crear los controles dinámicamente e iterar a través de Request.Form como en los viejos tiempos, sin embargo, estaba buscando un limpiador

¿Fue útil?

Solución

Hazlo de la misma manera que lo hiciste en ASP clásico. Use & Lt; input type = & Quot; casilla de verificación & Quot; & Gt; en lugar de < asp: casilla de verificación > ;. Puede acceder a los parámetros de publicación sin procesar utilizando Request.Form

Otros consejos

¿Has mirado el control CheckBoxList? Puede vincularlo a su conjunto de datos, proporcionar elementos de miembro de texto y miembros de valor, y también le permitirá ver fácilmente qué elementos se verifican. También existe la posibilidad de agregar dinámicamente más elementos de casilla de verificación si es necesario.

Recomiendo la solución ASP clásica cuando se enfrentan a condiciones absurdas de Viewstate. Es triste perder las buenas características que proporciona, pero combinando algunos controles habilitados para Viewstate (asp: *) con algunas técnicas clásicas (input type = & Quot; ... & Quot; ) me ha ahorrado un lote de dolores de cabeza en el pasado.

A veces solo quieres hacer algo simple, y la solución simple supera a " WYSIWYG " edición de formularios.

Una de las cosas que he hecho es registrar el estado de un cheque a través de AJAX en la sesión, luego en Postback (total o parcial a través de AJAX), busque en la sesión los elementos para realizar la acción seleccionada.

La idea básica es agregar un controlador onclick a la casilla de verificación que conoce la identificación del elemento asociado. En el controlador al hacer clic, comunique esta identificación al servidor a través de AJAX y regístrela en la sesión; también deberá comunicar el estado de la casilla de verificación para que pueda desmarcar elementos. Haga que el controlador para el control de envío use los datos sobre qué elementos se seleccionaron de la sesión.

Esta manera también le permite manejar datos paginados, ya que puede establecer el valor inicial de la casilla de verificación desde la sesión al representar (completa o parcial) una página con elementos marcados en ella.

Puede parecer algo como esto. Asumiendo ASP.NET AJAX con PageMethods (y ScriptManager, por supuesto).

<script type='text/javascript'>
   function record(checkbox,item)
   {
       var context = { ctl : checkbox };
       PageMethods.Record(item,checkbox.checked,onSuccess,onFailure,context);
   }

   function onSuccess(result,context)
   {
      // do something, maybe highlight the row, maybe nothing
   }

   function onFailure(error,context)
   {
       context.ctl.checked = false;
       alert(error.get_Message());
   }
</script>


...
<tr><td><input type='checkbox' onclick='record(this,"item_1");'></td><td>Item 1</td></tr>
...

Codebehind

[WebMethod(EnableSessionState=true)]
public static void Record( string itemName, bool value )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList == null)
     {
        itemList = new List<string>();
        Session["Items"] = itemList;
     }
     if (itemList.Contains(itemName) && !value)
     {
         itemList.Remove(itemName);
     }
     else if (!itemList.Contains(itemName) && value)
     {
         itemList.Add(itemName);
     }       
}

protected void button_OnClick( object sender, EventArgs e )
{
     List<string> itemList = (List<string>)Session["Items"];
     if (itemList != null)
     {
         foreach (string item in itemList)
         {
             // do something with the selected item
         }
     }
}

Deshabilitar ViewState. En caso de que no se pueda hacer, intente usar Sesión para almacenar el ver estado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top