none
Problemas con el Insert en la base de datos y desaparece un dropdown list RRS feed

  • 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.

     

    domingo, 23 de febrero de 2020 17:19