none
Perdida valores TEXBOXFOR cargados dinámicamente con jquery RRS feed

  • Pregunta

  • Buenas a todos.

    Tengo el siguiente problema,,, tengo una vista a la que le paso un modelo,, el modelo lo relleno pero hay campos que se calculan con jquery en base a otros campos introducidos, cuando se hace un submit esos valores se pierden.

    he puesto el modelstate.clear()

    he añadido en el evento submit un metodo para recorrer esos campos y volver a asignarles su mismo valor pero no me funciona.

    aqui dejo parte del código 

     
    submit: function () {
            $('#formAltaFactura').submit(function () {
                if ($('#importeFactura').val() != null) {
                    var value = $('#importeFactura').val();
                    $('#importeFactura').val(value);
                }
    //este calculo si me lo hace bien y lo conserva
    
    //el siguiente son texbox dinamicos que puedo añadir hasta 5, todos tienen el mismo name , los recorro y le asisgno su mismo valor pero se pierde.
    
                if ($('input[name="cuotas"]').length) {
                    var cuotas = document.getElementsByName("cuotas");
                    if (cuotas.length > 0) {
    
                        for (i = 0; i < cuotas.length; i++) {
                            var num = parseInt($("#" + cuotas[i].id).val())
                            if (!isNaN(num)) {
                                $("#" + cuotas[i].id).val(num)
                            }
                        }
                    }
                }
        });
        },

    este es mi controlador
    
     public ActionResult AltaFactura(FacturaModel model, string command)
            {
                ModelState.Clear();
                if (command.StartsWith("Eliminar"))
                {
                    CargarFacturaCombos(ref model);
                    int id =int.Parse(command.Split(',')[1]);
                    FacturaImpuestosModel impuesto = model.impuestoListado[id];
                    model.impuestoListado.Remove(impuesto);
                    ModelState.Clear();
                    return View("Index", model);
                }
                else
                {
                    if (command.Equals("AddImpuesto"))
                    {
    
                        model.impuestoListado.Add(new FacturaImpuestosModel());
                        CargarFacturaCombos(ref model);
                        model.InfoCabecera.NombreUsuario = Session["NombreUsuario"].ToString();
    
    
                        return View("Index", model);
                    }
                    else
                    {
                        if (!ExisteFactura(model))
                        {
                            return ActionAlta(model);
                        }
                        else
                        {
                            NotificationModel notification = new NotificationModel();
                            notification.tipo = Tipo.danger;
                            notification.mensaje = "Error: Factura ya existe";
                            notification.titulo = "";
                            TempData["notification"] = notification;
                            return RedirectToAction("Index", model);
                        }
    
                    }
                }
    
            }
    
    el controlador con el parámetro comand le indico si quiere un alta o añadir un campo dinámico,,, esos campos dinamicos son donde realizo el calculo con jquery ( if (command.Equals("AddImpuesto")))
    
    luego en la vista al recibir un impuesto de mas , recorro la lista y me pinta una nueva fila de texbox para rellenar 


    esta es la vista
    
    <table class="table table-hover">
                        <thead>
                            <tr>
                                @*<th>Código diario</th>*@
                                <th>Base imponible</th>
                                <th>Porcentaje IVA</th>
                                <th>Cuota IVA</th>
                            </tr>
                        </thead>
                        <tbody>
    
    
                            @{
                                for (int i = 0; i < Model.impuestoListado.Count; i++)
                                {
                                    <tr>
                                        @if (Model.idFactura > 0)
                                        {
                                            @*<td>*@
                                                @Html.HiddenFor(m => m.impuestoListado[i].Id)
                                                @*@Model.impuestoListado[i].Id*@
                                            @*</td>*@
                                        }
    
                                        <td>
                                            <div class="form-group row-bottom-margin">
                                                <div class="col-xs-8">
                                                    @Html.TextBoxFor(m => m.impuestoListado[i].BaseImponible, (Model.editable ? (object)new { @class = "form-control", placeholder = "",id="base"+@i, Name = "bases" } : (object)new { @class = "form-control", placeholder = "", @readonly = "" }))
                                                </div>
                                            </div>
                                        </td>
    
                                
                                        <td>
                                            <div class="form-group row-bottom-margin">
                                                <div class="col-xs-8">
                                                    @Html.TextBoxFor(m => m.impuestoListado[i].PorcentajeIVA, (Model.editable ? (object)new { @class = "form-control", placeholder = "",data_impuesto="calularImpuesto",id="porcentaje"+@i,@onblur="CalularImporteImpuesto(porcentaje"+@i+");" } : (object)new { @class = "form-control", placeholder = "", @readonly = "" }))
                                                </div>
                                            </div>
                                        </td>
                                        <td>
                                            <div class="form-group row-bottom-margin">
                                                <div class="col-xs-8">
                                                    @Html.TextBoxFor(m => m.impuestoListado[i].CuotaIVA, (Model.editable ? (object)new { @class = "form-control", placeholder = "",id="cuota"+@i, Name = "cuotas" } : (object)new { @class = "form-control", placeholder = "", @readonly = "" }))
                                                </div>
                                            </div>
                                        </td>
                                        
                                        <td>
                                            @{
                                                if (Model.editable)
                                                {
                                                    <button id="@i" type="submit" class="btn btn-danger" name="command" value="Eliminar,@i"><i class="fa fa-remove"></i></button>
                                                }
                                            }
                                       </td>
                                    </tr>
                                }
                            }
                        </tbody>
                    </table>
                </div>
            </div>
            <div class="box-footer">
                @{
                    if (Model.editable)
                    {
                        <button type="submit" class="btn btn-primary" name="command" value="GuardarFactura"><i class="fa fa-save"></i>Guardar</button>
                    }
                }
               
                @*<button id="cleanFilter" type="button" class="btn btn-danger"><i class="fa fa-trash"></i> Borrar Filtro</button>*@
            </div>

    Gracias y disculpen tanto código

    martes, 21 de febrero de 2017 16:59

Respuestas

  • hola

    >>si le doy al boton guardar eso tiene que ir a base de datos por lo que no puedo hacer el calculo al volver. yo lo necesito enviar para guardarlo.

    ahi te equivocas, se supone que en el servidor tienes que volver a realizar el calculo

    si tienes todos los datos simplemente lo calculas con codigo .net antes de guardarlo, desde javascript ese calculo solo es informativo no tienes que enviarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Isak Tortuga lunes, 27 de febrero de 2017 15:52
    martes, 21 de febrero de 2017 19:54

Todas las respuestas

  • hola

     >>he añadido en el evento submit un metodo para recorrer esos campos y volver a asignarles su mismo valor pero no me funciona.

    claro que no va a funcionar porque la pantalla completa se refresca y el submit en el cliente se ejecuta previo a este refresh de la pagina que envia los datos al action del controller

    tienes que ejecutar el codigo que calcula cuando la aplicaicon vuelve del post, o sea si usas jquery

    $(function(){
    
       //aqui debes poner el calculo
    
    });


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 21 de febrero de 2017 18:08
  • Gracias por responder pero me quedan dudas:

    la vista tiene dos campos: iva y el otro es el total

    luego tengo un boton que al hacer click va al controlador añade un objeto a un listado y al volver a la vista ese listado lo recorro y si hay un elemento pinto una fila de 3 texbox y asi hasta 5 filas

    en el primer texbox pongo un importe en el segundo pongo un porcentaje y el tercero se calcula autmáticamente.

    si yo añado otra fila, va al controlador por lo que no puedo hacer el calculo al volver ya que visualmente el usuario tiene que ver el calculo en el instante que introduce los importes.

    por otro lado los  dos primeros campos iva y total son para que una vez introduzca 1 o 5 filas , en el campo iva meto un porcentaje y en el total se calcula en base a lo que he introducido en las filas.

    si le doy al boton guardar eso tiene que ir a base de datos por lo que no puedo hacer el calculo al volver. yo lo necesito enviar para guardarlo.

    disculpa si no me he explicado bien.

    un saludo


    martes, 21 de febrero de 2017 19:38
  • hola

    >>si le doy al boton guardar eso tiene que ir a base de datos por lo que no puedo hacer el calculo al volver. yo lo necesito enviar para guardarlo.

    ahi te equivocas, se supone que en el servidor tienes que volver a realizar el calculo

    si tienes todos los datos simplemente lo calculas con codigo .net antes de guardarlo, desde javascript ese calculo solo es informativo no tienes que enviarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Isak Tortuga lunes, 27 de febrero de 2017 15:52
    martes, 21 de febrero de 2017 19:54