InitialValue no se establece en RequiredFieldValidator DDL

Por alguna razón, el valor inicial de la lista desplegable no se establece. En su lugar, siempre carga algún valor aleatorio. Cuando miro el marcado, puedo ver todos los elementos de la lista, incluido el que tiene el valor -1. También intenté borrar la caché del navegador y establecer explícitamente el SelectedIndex / Value en el código en 0 / "- 1", pero parece que no puedo entender qué está pasando. ¿Alguna idea?

Así es como lo estoy haciendo:

<asp:DropDownList ID="ddlGender" runat="server" CssClass="select_Box" OnPreRender="LoadGenders">
                            </asp:DropDownList>
                            <div class="error"> 
                                <asp:RequiredFieldValidator                                     
                                    ID="RequiredFieldValidatorGender"
                                    Runat="server"
                                    Enabled="true"
                                    InitialValue="-1"
                                    ControlToValidate="ddlGender"
                                    SetFocusOnError="true"                                        
                                    Display="Dynamic">Gender Required</asp:RequiredFieldValidator>
                            </div>

HTML generado:

<select name="pagecolumns_0$pagecontent_1$contentleftcol_0$ctl00$ddlGender" id="pagecolumns_0_pagecontent_1_contentleftcol_0_ctl00_ddlGender" class="select_Box">
<option value="-1">--Select Gender--</option>
<option selected="selected" value="M">Male</option>
<option value="F">Female</option></select>

como puede ver, está seleccionando Macho al azar. También me doy cuenta de que la última vez que llené el formulario lo configuré en Masculino antes de presionar enviar. ¿Puede estar almacenando en caché la selección?

Aquí está el .cs:

protected void LoadGenders(object sender, EventArgs e)
        {
            if (IsPostBack) return;
            ((DropDownList)sender).Items.AddRange(Constants.GenderWithSelect);
        }
public static ListItem[] GenderWithSelect = (new[] { new ListItem("--Select Gender--", "-1") }).Concat(Gender).ToArray();
 public static ListItem[] Gender = new[]
                                              {
                                                  (new ListItem("Male","M")),
                                                  (new ListItem("Female","F"))
                                              };


preguntado el 16 de mayo de 11 a las 19:05

¿Qué quieres decir con que el valor inicial de ddl no se establece? ¿Podemos ver el marcado de generación de ddl. -

por favor, publique la parte .cs, ¿cómo enlaza la lista desplegable? -

Modifiqué mi pregunta para incluir .cs y marcado html. -

Entonces, ¿se establece inicialmente en "-1" cuando carga la página correctamente por primera vez? Después de configurarlo en Hombre y hacer clic en enviar, se mantiene el valor. Ese debería ser un comportamiento DDL normal de asp.net. No veo ahora dónde entra el RFValidator en su problema. -

@gbs lo siento .. No lo digo bien. Conozco el comportamiento normal. Entonces, esto es lo que está sucediendo: 1. La solución se construye y cargo la página, veo que -1 está seleccionado. Yo digo genial. 2. Selecciono Hombre y envío el formulario. 3. Vuelvo al formulario, veo que se ha seleccionado Hombre. no es genial. 5. Borro el caché, cambio de navegador y vuelvo a cargar la página. y aún se selecciona Hombre. Es raro. Siempre es masculino hasta que hago algún cambio y vuelvo a crear la solución. -

2 Respuestas

Probé su código y parece que el html generado no tenía el campo correcto vinculado al "valor" de las opciones de selección.

Lo que debe obtener debe tener este formato:

<select name="ctl00$MainContent$ddlGender" id="MainContent_ddlGender" class="select_Box">
  <option selected="selected" value="-1">not set</option>
  <option value="0">0</option>
  <option value="1">1</option>
</select>

Para tener esto, tuve que configurar el DataValueField de DropDownList:

<asp:DropDownList ID="ddlGender" runat="server" CssClass="select_Box" OnPreRender="ddlGender_PreRender" DataValueField="Value" DataTextField="Text">

(Simplemente reemplace DataTextField y DataValueField con el nombre de las propiedades de su clase)

contestado el 16 de mayo de 11 a las 23:05

Estos valores no se completan desde una base de datos. Entonces, no estoy seguro de cómo consumir DataValueField. Agregué más información a la pregunta. - xoail

Resulta que tiene algo que ver con la secuencia de carga de los controles. Entonces, agregar selectedindex a LoadGenders hizo el truco.

protected void LoadGenders(object sender, EventArgs e)
    {
        if (IsPostBack) return;
        ((DropDownList)sender).Items.AddRange(Constants.GenderWithSelect);
        ((DropDownList) sender).SelectedIndex = 0;
    }

contestado el 18 de mayo de 11 a las 01:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.