Usuario
Problemas con el Insert en la base de datos y desaparece un dropdown list

Pregunta
-
Buenas a todos.
Cualquier ayuda os lo agradecería mucho, ya no sé que hacer más. Llevo días atascado con esto. Soy novato.
Primer Problema
Os explico, tengo un formulario para hacer socio a la gente, y que cuando en país, si eliges en el dropdownlist un país diferente de España, el control "panelDdlProvincia" de tipo droplist se transforma en un textbox y aparece en acción el control "panelTbProvinciaNombre".
El problema es que cuando eligo un país diferente a España, el control "ddlPais" desaparece. También se produce el mismo efecto cuando se hace el autocompletado de Google.
He puesto UpdatePanels y el problema sigue sin resolverse.
Segundo Problema
Es imposible hacer el insert, no sé si es porque como desaparece el control "ddlPais" y no puede ser null, no deja insertar el registro en la base de datos.
Os dejo los archivos, por si me podéis iluminar jeje.
<asp:Content ContentPlaceHolderID="MainContent" runat="Server"> <!-- TÍTULO --> <section class="section titulo"> <div class="container"> <!-- Start Row --> <div class="row"> <div class="col-lg-12"> <div class="pricing-text section-header text-center"> <div> <h2 class="section-title">Datos personales</h2> <div class="texto center"> <p>Rellena el siguiente formulario</p> </div> </div> </div> </div> </div> <!-- TíTULO --> <!-- FORMULARIO --> <section class="section formulario"> <!-- Container Starts --> <div class="container"> <!-- Start Row --> <div class="row"> <!-- Start Col --> <div class="col-lg-12 col-md-12"> <div class="needs-validation" id="contactForm"> <div class="row"> <div class="col-lg-12 form-group"> <!-- TipoAbono --> <asp:Label runat="server" AssociatedControlID="ddlTipoAbono">Tipo de Abono</asp:Label><span class="requerido">*</span> <asp:UpdatePanel ID="upTipoAbono" UpdateMode="Conditional" runat="server"> <ContentTemplate> <asp:DropDownList ID="ddlTipoAbono" runat="server" CssClass="form-control selectpicker" DataTextField="nombre" DataValueField="id" AutoPostBack="False"> </asp:DropDownList> </ContentTemplate> </asp:UpdatePanel> <asp:RequiredFieldValidator ID="rfvTipoAbono" runat="server" ErrorMessage="Seleccione una opción" CssClass="invalid-feedback" Text="*" InitialValue="none" ControlToValidate="ddlTipoAbono" ValidationGroup="ValidationButton"></asp:RequiredFieldValidator> </div> <!-- Nombre --> <div class="col-md-6 form-group"> <asp:Label runat="server" AssociatedControlID="tbNombre">Nombre</asp:Label><span class="requerido">*</span> <asp:TextBox runat="server" ID="tbNombre" CssClass="form-control" /> <div> <asp:RequiredFieldValidator ID="rfvNombre" runat="server" CssClass="invalid-feedback" ControlToValidate="tbNombre" Display="Dynamic" ErrorMessage="Introduzca un nombre válido" /> <ajax:ValidatorCalloutExtender ID="vceRfvNombre" runat="server" CssClass="oculto" TargetControlID="rfvNombre" HighlightCssClass="error" /> </div> </div> <!-- Apellidos --> <div class="col-md-6 form-group"> <asp:Label runat="server" AssociatedControlID="tbApellidos">Apellidos</asp:Label><span class="requerido">*</span> <asp:TextBox runat="server" ID="tbApellidos" CssClass="form-control" /> <div> <asp:RequiredFieldValidator ID="rfvApellidos" runat="server" CssClass="invalid-feedback" ControlToValidate="tbApellidos" Display="Dynamic" ErrorMessage="Introduzca apellidos válidos" /> <ajax:ValidatorCalloutExtender ID="vceRfvApellidos" runat="server" CssClass="oculto" TargetControlID="rfvApellidos" HighlightCssClass="error" /> </div> </div> <!-- Email --> <div class="col-md-6 form-group"> <asp:Label runat="server" AssociatedControlID="tbEmail">Email</asp:Label><span class="requerido">*</span> <asp:TextBox ID="tbEmail" CssClass="form-control" runat="server" /> <div> <asp:RequiredFieldValidator ID="rfvTbEmail" runat="server" ControlToValidate="tbEmail" ErrorMessage="Introduzca un email válido" Display="Dynamic" CssClass="invalid-feedback" /> <ajax:ValidatorCalloutExtender ID="vceRfvTbEmail" runat="server" TargetControlID="rfvTbEmail" HighlightCssClass="error" CssClass="oculto" /> </div> <div> <asp:RegularExpressionValidator ID="revTbEmail" runat="server" ControlToValidate="tbEmail" ErrorMessage="Formato incorrecto" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" Display="Dynamic" CssClass="invalid-feedback" /> <ajax:ValidatorCalloutExtender ID="vceRevTbUsuario" runat="server" TargetControlID="revTbEmail" HighlightCssClass="error" CssClass="oculto" /> </div> <div> <asp:CustomValidator ID="cvTbEmail" runat="server" ErrorMessage="Formato incorrecto" ValidateEmptyText="false" ControlToValidate="tbEmail" Display="dynamic" CssClass="invalid-feedback" /> <ajax:ValidatorCalloutExtender ID="vceCvTbEmail" runat="server" TargetControlID="cvTbEmail" HighlightCssClass="error" CssClass="oculto" /> </div> </div> <!-- Telefono --> <div class="col-md-6 form-group"> <asp:Label runat="server" AssociatedControlID="tbTelefono">Teléfono</asp:Label><span class="requerido">*</span> <asp:TextBox ID="tbTelefono" CssClass="form-control" runat="server" /> <div> <asp:RequiredFieldValidator ID="rfvTbTelefono" runat="server" ControlToValidate="tbTelefono" ErrorMessage="Introduzca un teléfono válido" Display="Dynamic" CssClass="invalid-feedback" /> <ajax:FilteredTextBoxExtender ID="fteTbTelefono" runat="server" TargetControlID="tbTelefono" FilterType="Numbers" /> <ajax:ValidatorCalloutExtender ID="vceRfvTbTelefono" runat="server" TargetControlID="rfvTbTelefono" HighlightCssClass="error" CssClass="oculto" /> </div> </div> <!-- Direccion --> <div class="col-md-12 form-group"> <asp:Label runat="server" AssociatedControlID="tbDireccion">Dirección</asp:Label><span class="requerido">*</span> <asp:TextBox ID="tbDireccion" CssClass="form-control" runat="server" /> <div> <asp:RequiredFieldValidator ID="rfvTbDireccion" runat="server" CssClass="invalid-feedback" ControlToValidate="tbDireccion" Display="Dynamic" ErrorMessage="Introduczca una dirección válida" /> <ajax:ValidatorCalloutExtender ID="vceRfvTbDireccion" runat="server" CssClass="oculto" TargetControlID="rfvTbDireccion" HighlightCssClass="error" /> </div> </div> <!-- Codigo Postal --> <div class="col-md-6 form-group"> <asp:Label runat="server" AssociatedControlID="tbCodigoPostal">Código Postal</asp:Label><span class="requerido">*</span> <asp:TextBox ID="tbCodigoPostal" CssClass="form-control" runat="server" /> <div> <asp:RequiredFieldValidator ID="rfvTbCodigoPostal" runat="server" ControlToValidate="tbCodigoPostal" ErrorMessage="Introduzca un código postal válido" Display="Dynamic" CssClass="invalid-feedback" /> <ajax:FilteredTextBoxExtender ID="fteTbCodigoPostal" runat="server" TargetControlID="tbCodigoPostal" FilterType="Numbers" /> <ajax:ValidatorCalloutExtender ID="vceRfvTbCodigoPostal" runat="server" TargetControlID="rfvTbCodigoPostal" HighlightCssClass="error" CssClass="oculto" /> </div> <div> <asp:RegularExpressionValidator ID="revTbCodigoPostal" runat="server" ControlToValidate="tbCodigoPostal" ErrorMessage="Formato incorrecto" ValidationExpression="^\d{5}$" Display="Dynamic" CssClass="invalid-feedback" /> <ajax:ValidatorCalloutExtender ID="vceRevTbCodigoPostal" runat="server" TargetControlID="revTbCodigoPostal" HighlightCssClass="error" CssClass="oculto" /> </div> </div> <!-- Poblacion--> <div class="col-md-6 form-group"> <asp:Label runat="server" AssociatedControlID="tbPoblacion">Población</asp:Label><span class="requerido">*</span> <asp:TextBox runat="server" ID="tbPoblacion" CssClass="form-control" /> <div> <asp:RequiredFieldValidator ID="rfvTbPoblacion" runat="server" CssClass="invalid-feedback" ControlToValidate="tbPoblacion" Display="Dynamic" ErrorMessage="Introduzca un población válida" /> <ajax:ValidatorCalloutExtender ID="vceRfvTbPoblacion" runat="server" CssClass="oculto" TargetControlID="rfvTbPoblacion" HighlightCssClass="error" /> </div> </div> <asp:UpdatePanel ID="upProvinciaNombre" runat="server" UpdateMode="Conditional" class="col-md-6 form-group"> <ContentTemplate> <!-- Provincia --> <div id="panelDdlProvincia" runat="server" visible="true"> <asp:Label runat="server" AssociatedControlID="ddlProvincia">Provincia</asp:Label><span class="requerido">*</span> <asp:DropDownList ID="ddlProvincia" runat="server" CssClass="form-control selectpicker" /> <asp:RequiredFieldValidator ID="rfvProvincia" runat="server" ErrorMessage="Seleccione una opción" CssClass="invalid-feedback" Text="*" InitialValue="none" ControlToValidate="ddlProvincia" ValidationGroup="ValidationButton"></asp:RequiredFieldValidator> </div> <!-- Provincia Nombre --> <div ID="panelTbProvinciaNombre" runat="server" visible="false"> <asp:Label runat="server" ID="lbProvinciaNombre" AssociatedControlID="tbProvinciaNombre">Provincia</asp:Label><span class="requerido">*</span> <asp:TextBox ID="tbProvinciaNombre" runat="server" CssClass="form-control"></asp:TextBox> <div> <asp:RequiredFieldValidator ID="rfvTbProvinciaNombre" runat="server" CssClass="invalid-feedback" ControlToValidate="tbProvinciaNombre" Display="Dynamic" ErrorMessage="Introduzca una provincia válida" /> <ajax:ValidatorCalloutExtender ID="vceRfvTbProvinciaNombre" runat="server" TargetControlID="rfvTbProvinciaNombre" HighlightCssClass="error" CssClass="oculto" /> </div> </div> </ContentTemplate> </asp:UpdatePanel> <!-- Pais --> <asp:UpdatePanel ID="upPais" runat="server" UpdateMode="Conditional" class="col-md-6 form-group"> <ContentTemplate> <asp:Label runat="server" AssociatedControlID="ddlPais">Pais</asp:Label><span class="requerido">*</span> <asp:DropDownList ID="ddlPais" runat="server" CssClass="form-control selectpicker" AutoPostBack="true" /> <asp:RequiredFieldValidator ID="rfvPais" runat="server" ErrorMessage="Seleccione una opción" CssClass="invalid-feedback" Text="*" InitialValue="none" ControlToValidate="ddlPais" ValidationGroup="ValidationButton"></asp:RequiredFieldValidator> </ContentTemplate> </asp:UpdatePanel> <!-- Políticas --> <div class="col-md-12 form-group"> <div class="checkbox"> <asp:CheckBox ID="cbPoliticas" runat="server" /> <asp:Label runat="server" ID="politicas" AssociatedControlID="cbPoliticas">He leído y acepto la <asp:HyperLink ID="hlkPoliticaPrivacidad" runat="server" Target="_blank" NavigateUrl="~/contenidos/privacidad.aspx" Text="política de privacidad" /> y el <asp:HyperLink ID="hlkAvisoLegal" runat="server" Target="_blank" NavigateUrl="~/contenidos/avisoLegal.aspx" Text="aviso legal" /> del sitio web. </asp:Label> <div> <asp:TextBox ID="tbFakeCv" runat="server" CssClass="oculto" /> <asp:CustomValidator runat="server" ID="cvCbPoliticas" ErrorMessage="Es obligatorio aceptar la política de privacidad" CssClass="error" Display="Dynamic" ControlToValidate="tbFakeCv" ValidateEmptyText="true" ValidationGroup="ValidationButton" /> <ajax:ValidatorCalloutExtender ID="vceCvCbPoliticas" runat="server" TargetControlID="cvCbPoliticas" HighlightCssClass="error" CssClass="oculto" /> </div> </div> </div> <asp:UpdatePanel ID="upHazteSocio" runat="server" UpdateMode="Conditional" class="col-md-12 centrar"> <ContentTemplate> <div class="plan-button"> <asp:LinkButton ID="btnHazteSocio" runat="server" CssClass="btn btn-common" Text="Pagar" OnClick="btnHazteSocio_Click" ValidationGroup="ValidationButton" /> </div> </ContentTemplate> </asp:UpdatePanel> </div> </div> </div> </div> <!-- End Col --> </div> <!-- End Row --> </section> </div> </section> <!-- FORMULARIO --> </asp:Content>
Aquí el hazteSocio.aspx.vb
Imports System.IO Partial Class contenidos_hazteSocio Inherits System.Web.UI.Page Protected Overrides Sub OnLoad(e As EventArgs) If Not Page.IsPostBack Then _CargarPaises() _CargarProvincias() _CargarTipoAbono() End If End Sub Private Sub _CargarPaises() Dim paises As List(Of Pais) = PaisDAO.Instance.GetPaises ListUtil.Instance.CargarLista(ddlPais, paises, campoTexto:="Nombre") End Sub Private Sub _CargarProvincias() Dim provincias As List(Of Provincia) = ProvinciaDAO.Instance.GetProvincias ListUtil.Instance.CargarLista(ddlProvincia, provincias, campoTexto:="Nombre") End Sub Private Sub _CargarTipoAbono() Dim abonos As List(Of TipoAbono) = TipoAbonoDAO.Instance.GetTiposAbonos ListUtil.Instance.CargarLista(ddlTipoAbono, abonos, campoTexto:="Nombre") End Sub Protected Sub btnHazteSocio_Click(sender As Object, e As EventArgs) Handles btnHazteSocio.Click If Page.IsValid Then Dim socio As New Socio With socio .Nombre = tbNombre.Text .Apellidos = tbApellidos.Text .Email = tbEmail.Text .Telefono = tbTelefono.Text .Direccion = tbDireccion.Text .CodigoPostal = tbCodigoPostal.Text .Poblacion = tbPoblacion.Text .FechaCreacion = DateTime.Now .ProvinciaNombre = tbProvinciaNombre.Text .Id_pais = ddlPais.SelectedValue .Id_provincia = ddlProvincia.SelectedValue .Id_tipoAbono = ddlTipoAbono.SelectedValue End With Dim idSocio As Long = SocioDAO.Instance.NuevoSocio(socio) _ResetearFormulario() End If End Sub Private Sub _ResetearFormulario() ddlTipoAbono.SelectedValue = 0 ddlProvincia.SelectedValue = 0 ddlPais.SelectedValue = 0 tbNombre.Text = "" tbNombre.Enabled = False tbApellidos.Text = "" tbApellidos.Enabled = False tbEmail.Text = "" tbEmail.Enabled = False tbTelefono.Text = "" tbTelefono.Enabled = False tbDireccion.Text = "" tbDireccion.Enabled = False tbCodigoPostal.Enabled = False tbCodigoPostal.Text = "" tbPoblacion.Text = "" End Sub ''' <summary> ''' Valida que se haya aceptado la política de privacidad ''' </summary> ''' <param name="source"></param> ''' <param name="args"></param> Protected Sub cvChkPoliticaPrivacidad_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles cvCbPoliticas.ServerValidate args.IsValid = cbPoliticas.Checked End Sub Protected Sub ddlPais_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ddlPais.SelectedIndexChanged If ddlPais.SelectedValue <> ConstantesKeys.ID_PAIS_ESPANA Then panelTbProvinciaNombre.Visible = True panelDdlProvincia.Visible = False tbProvinciaNombre.Text = " " Else panelTbProvinciaNombre.Visible = False panelDdlProvincia.Visible = True End If upProvinciaNombre.Update() End Sub End Class
Esta es la clase Socio.DAO
Imports persistencia Public Class SocioDAO Private Shared _instance As SocioDAO ''' <summary> ''' Devuelve la instancia única de la clase <code>SocioDAo</code>, y en caso de que no esté creada procede a su creación. ''' </summary> ''' <value>Crea la instancia.</value> ''' <returns>Retorna la instancia.</returns> ''' <remarks></remarks> Public Shared ReadOnly Property Instance() As SocioDAO Get If _instance Is Nothing Then _instance = New SocioDAO End If Return _instance End Get End Property ''' <summary> ''' Crea un nuevo socio en la BD ''' </summary> ''' <param name="socio">Objeto de tipo socio con los atributos del socio. Es obligatorio.</param> ''' <returns>El identificador del socio recién creado</returns> ''' Public Function NuevoSocio(socio As Socio) As Integer Dim db As New persistencia.OviedoFemeninoDataContext Dim itemSocio As New Socios With itemSocio .id_provincia = socio.Id_provincia .id_pais = socio.Id_pais .id_tipoAbono = socio.Id_tipoAbono .nombre = socio.Nombre .apellidos = socio.Apellidos .email = socio.Email .telefono = socio.Telefono .direccion = socio.Direccion .codigoPostal = socio.CodigoPostal .poblacion = socio.Poblacion .fechaCreacion = DateTime.Now .provinciaNombre = socio.ProvinciaNombre End With db.Socios.InsertOnSubmit(itemSocio) db.SubmitChanges() Return itemSocio.id End Function End Class
Muchas gracias a todos
Saludos.