none
Problemas para recuperar los datos de una vista Parcial y Pasarlos a una accion de un controlador RRS feed

  • Pregunta

  • Buenas Tardes

    Actualmente estoy desarrollando un app MVC y una los formularios invoco un modal  una vista Parcial donde debo registrar los datos de una TC

    ---Esta es mi Vista Parcial

                     

    @using (Html.BeginForm()) 
    {
        @Html.AntiForgeryToken()

        <form class="form-horizontal" method="post" action='@Url.Action("CrearTC", "Cliente")'>
            <div class="row" >
                <div class="col-md-12">
                    <div class="fieldset">
                        @Html.TextBoxFor(m => m.No_TC, new { @class = "form-control", placeholder = "Numero de Tarjeta" })

                        @*<input type="text" class="form-control" placeholder="Numero de Tarjeta" />*@
                    </div>
                </div>
            </div>
            <div class="row ">
                <div class="col-md-3 col-sm-3 col-xs-3">
                    <span class="help-block text-muted small-font">Mes VencimienTo</span>
                    @Html.TextBoxFor(m => m.Mes_Vence, new { @class = "form-control", placeholder = "MM" })
                    @*<input type="text" class="form-control" placeholder="MM" />*@
                </div>
                <div class="col-md-3 col-sm-3 col-xs-3">
                    <span class="help-block text-muted small-font"> Año de Vecimiento</span>
                    @Html.TextBoxFor(m => m.Ano_Vence, new { @class = "form-control", placeholder = "YYYY" })
                    @*<input type="text" class="form-control" placeholder="YY" />*@
                </div>
                <div class="col-md-3 col-sm-3 col-xs-3">
                    <span class="help-block text-muted small-font">  CCV</span>
                    @Html.TextBoxFor(m => m.CCV, new { @class = "form-control", placeholder = "CCV" })
                    @*<input type="text" class="form-control" placeholder="CCV" />*@
                </div>
                <div class="col-md-3 col-sm-3 col-xs-3">
                    <img src="~/Content/assets/img/1.png" class="img-rounded" />
                </div>
            </div>
            <div class="row ">
                <div class="col-md-12 pad-adjust">
                    <div class="fieldset">
                        @Html.TextBoxFor(m => m.Titula, new { @class = "form-control", placeholder = "Titular Tarjeta" })
                        @*<input type="text" class="form-control" placeholder="Titular Tarjeta" />*@
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-md-12 pad-adjust">

                    <span class="help-block text-muted small-font">Numero de Cuotas</span>
                    @Html.TextBoxFor(m => m.No_Cuotas, new { @class = "form-control", placeholder = "Numero de Cuotas" })
                    @*<input type="text" class="form-control" placeholder="Numero de Cuotas" />*@

                </div>
            </div>
            <div class="row ">
                @*<div class="col-md-6 col-sm-6 col-xs-6 pad-adjust">
                        <input type="submit" class="btn btn-danger" value="CANCELAR" />
                    </div>*@
                <div class="col-md-6 col-sm-6 col-xs-6 pad-adjust">

                    <input type="submit" class="btn btn-primary" onclick="InvocarSave()" value="Confirmar" />

                </div>

            </div>
        </form>

    ---Y en mi Vista principal asi llamo a la vista parcial

                                                                                 

    <div class="modal fade" role="dialog" id="myModal" tabindex="-5" aria-labelledby="myModalLabel" style="display: none;">
                    <div class="row ">
                        <div class="col-md-4 col-md-offset-4">
                            <div class="credit-card-div">
                                <div class="panel panel-default">
                                    <div class="panel-heading">

                                        <div id="divtc">
                                            @Html.Partial("~/Views/Cliente/CrearTCini.cshtml", Model)
                                        </div> 

                                    </div>
                                </div>
                            </div>

                            <!-- CREDIT CARD DIV END -->
                        </div>

                    </div>
                </div>
                 </div>

    En mi vista Parcial usandoo el siguiente js invoco la accion que me va a prmitir guardar los datos 

    <script>
    function InvocarSave() {
        var laURLDeLaVista = '@Url.Action("CrearTC", "Cliente")';
        $.ajax({
            cache: false,
            async: true,
            type: "POST",
            url: laURLDeLaVista,
            data: {},
            success: function (response) {
                $('#resultado').html('');
                $('#resultado').html(response);
            }
        });
    }
    </script>

    y esta es mi accion en el controlador Cliente

               

    [HttpPost]
            public ActionResult CrearTC()
            {
                CRM.Models.Cliente _obtc = new Models.Cliente();

                _obtc.No_TC = Request.Form["No_TC"].ToString();
                _obtc.CCV  = Request.Form["CCV"].ToString();
                _obtc.id_Cte = Convert.ToInt32(this.Session["id_cliente"]);
                _obtc.Mes_Vence= Request.Form["Mes_Vence"].ToString();
                _obtc.Ano_Vence = Request.Form["Ano_Vence"].ToString();
                _obtc.Titula = Request.Form["Titula"].ToString();
                _obtc.No_Cuotas = Convert.ToInt32(Request.Form["No_Cuotas"]);
                _obtc.Estado_Vali = 0;
                _obtc.Creado_P = Session["Session_Usuario"].ToString().Trim();
                _obtc.Fecha_C = DateTime.Now;
                _obtc.GetInsertaTC(_obtc.No_TC, _obtc.CCV , _obtc.id_Cte, _obtc.Mes_Vence, _obtc.Ano_Vence,
                       _obtc.Titula, _obtc.No_Cuotas, _obtc.Estado_Vali, _obtc.Creado_P, _obtc.Fecha_C);



                return View(_obtc);


              }

    El problema es que yo recupero los valores via Request.Form, pero lo datos no me estan llegando al controlador y no encuentro que pude estar pasando quiza me falta algo o mi pregunta es comoo podria pasar estos datos via js.

    Quedo atento a sus comentarios

    Mil gracias

    Saludos


    Carlos Alberto Hernández R. CEO -Xtreme Business Solutions Movil: 3102334026 Bogota- Colombia

    jueves, 6 de octubre de 2016 2:55

Respuestas

  • Veo un problema con el diseño de tu vista: tiene un @Html.BeginForm, que al ejecutarse generará un tag <form>, y dentro tienes metido otro <form> directamente en html. Lo de anidar un form dentro de otro es probable que le siente bastante mal al navegador y que se haga un lío y no envíe bien los campos. Decide cuál de los dos <form> es el que quieres usar, y deja solo ese.
    jueves, 6 de octubre de 2016 7:07
  • hola

    Coincido con Alberto si defines la linea

    @using (Html.BeginForm())

    no puedes usar

    <form class="form-horizontal" method="post" action='@Url.Action("CrearTC", "Cliente")'>

    es uno u otro

    recomendaria uses

    @using (Html.BeginForm("CrearTC", "Cliente", FormMethod.Post)) 


    >>El problema es que yo recupero los valores via Request.Form

    no es buena idea porque no defiens uan clase como ser

            [HttpPost]
            public ActionResult CrearTC(CRM.Models.Cliente model)
            {
     



    de esta forma dejas que sea el model binding quien asigne los datos

    lo que no veo es como envias el "data" en el $ajax de InvocarSave() lo estas dejando vacio, deberia ser

    function InvocarSave() {
    
        var laURLDeLaVista = '@Url.Action("CrearTC", "Cliente")';
    	
    	var params = {
    	   No_TC :  $("#No_TC").val(),
    	   //resto
    	};
    
        $.ajax({
            cache: false,
            async: true,
            type: "POST",
            url: laURLDeLaVista,
            data: params,
            success: function (response) {
                $('#resultado').html('');
                $('#resultado').html(response);
            }
        });
    }

    sino envias datos en el $.ajax del otro lado no los recibiras

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 6 de octubre de 2016 13:34

Todas las respuestas

  • Veo un problema con el diseño de tu vista: tiene un @Html.BeginForm, que al ejecutarse generará un tag <form>, y dentro tienes metido otro <form> directamente en html. Lo de anidar un form dentro de otro es probable que le siente bastante mal al navegador y que se haga un lío y no envíe bien los campos. Decide cuál de los dos <form> es el que quieres usar, y deja solo ese.
    jueves, 6 de octubre de 2016 7:07
  • hola

    Coincido con Alberto si defines la linea

    @using (Html.BeginForm())

    no puedes usar

    <form class="form-horizontal" method="post" action='@Url.Action("CrearTC", "Cliente")'>

    es uno u otro

    recomendaria uses

    @using (Html.BeginForm("CrearTC", "Cliente", FormMethod.Post)) 


    >>El problema es que yo recupero los valores via Request.Form

    no es buena idea porque no defiens uan clase como ser

            [HttpPost]
            public ActionResult CrearTC(CRM.Models.Cliente model)
            {
     



    de esta forma dejas que sea el model binding quien asigne los datos

    lo que no veo es como envias el "data" en el $ajax de InvocarSave() lo estas dejando vacio, deberia ser

    function InvocarSave() {
    
        var laURLDeLaVista = '@Url.Action("CrearTC", "Cliente")';
    	
    	var params = {
    	   No_TC :  $("#No_TC").val(),
    	   //resto
    	};
    
        $.ajax({
            cache: false,
            async: true,
            type: "POST",
            url: laURLDeLaVista,
            data: params,
            success: function (response) {
                $('#resultado').html('');
                $('#resultado').html(response);
            }
        });
    }

    sino envias datos en el $.ajax del otro lado no los recibiras

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 6 de octubre de 2016 13:34
  • Muchas gracias Alberto y Leandro sabia que por algun lado no estaba haciendo algo bien.

    Solo una consulta Leandro es que la verdad he usado poco js hasta ahora lo he empezado a usar

    Como recupero le paso los datos recuperados en el js a este ActionResult CrearTC ya que como les comente yo usaba un Request.Form y funcionaba porque los campos estaban en la misma vista pero al pasarlos a una vista Parcial se me complico

    El problema es que yo recupero los valores via Request.Form

    no es buena idea porque no defiens uan clase como ser

            [HttpPost]
            public ActionResult CrearTC(CRM.Models.Cliente model)
            {

    Quedo atento mil gracias

    Saludos


    Carlos Alberto Hernández R. CEO -Xtreme Business Solutions Movil: 3102334026 Bogota- Colombia

    jueves, 6 de octubre de 2016 15:29
  • Leandro:

    Ya me funciono ya me esta pasando los datos correctamente eres un genio.

    mil gracias

    Saludos


    Carlos Alberto Hernández R. CEO -Xtreme Business Solutions Movil: 3102334026 Bogota- Colombia

    jueves, 6 de octubre de 2016 16:50