none
Ayuda con Json + MVC +Controlador; para poder regresar un valor a la vista RRS feed

  • Pregunta

  •  bien les comento; tengo 2 dropdownlist en cascada;  hasta aqui no hay problema,la problematica radica que cuando uno de esos dos cambie se tiene que ejecutar un procedimiento para calcular un numero consecutivo de acuerdo a lo seleccionado en los dropdownlist.

    1.- los dropdownlist los cargo asi.

        <script type="text/javascript">
        $(document).ready(function () {
            $("#LICITACIONID").change(function () {
                $("#NUMERALID").empty();
                $.ajax({
                    type: 'POST',
                    url: '@Url.Action("ObtenerNumerales")',
                        dataType: 'json',
                        data: { LicitacionId: $("#LICITACIONID").val() },
                        success: function (numerales) {
                            var MProveeedorId = $("#MPROVEEDORID").val();
                            var LicitacionId = $("#LICITACIONID").val();
                            Calcular_Num_Pregunta(MProveeedorId, LicitacionId);
                            $.each(numerales, function (i, numeral) {
                                $("#NUMERALID").append('<option value="'
                                    + numeral.NUMERALID + '">'
                                    + numeral.DESCRIPCIONNUMERAL + '</option>');
                            });
                        },
                        error: function (ex) {
                            alert('Error al Cargar los Numerales del Procedimiento: ' + ex);
                        }
                    });
                    return false
                })
            });
    
            /*Evento que se activa al cambiar el Proveedor*/
            $(document).ready(function () {
                $("#MPROVEEDORID").change(function () {
                    var MProveeedorId = $("#MPROVEEDORID").val();
                    var LicitacionId = $("#LICITACIONID").val();
                    Calcular_Num_Pregunta(MProveeedorId,LicitacionId);
                })
            });
    
            /*Funcion para Calcular el Numero de Pregunta que le corresponde al Proveedor y al Evento*/
            function Calcular_Num_Pregunta(MProveeedorId, LicitacionId) {
                debugger;
                if (MProveeedorId > 0 && LicitacionId > 0) {
                    //alert("Proveedor; " + MProveeedorId + "\n Procedimiento de Contratación:"+ LicitacionId);
                    $.ajax({
                        type: 'POST',
                        url: '@Url.Action("Calcular_Num_Pregunta")',
                        dataType: 'json',
                        data: { MProveeedorId:MProveeedorId, LicitacionId: LicitacionId },
                        success: function (response) {
                            alert(response);
                        },
                        error: function (response) {
                            alert(response);
                        }
                    });
                }
            }
    
        </script>   
    }

    ahora para cada que cambie algun dato en el dropdown list ejecuto lo siguiente

    function Calcular_Num_Pregunta(MProveeedorId, LicitacionId) {
                debugger;
                if (MProveeedorId > 0 && LicitacionId > 0) {
                    //alert("Proveedor; " + MProveeedorId + "\n Procedimiento de Contratación:"+ LicitacionId);
                    $.ajax({
                        type: 'POST',
                        url: '@Url.Action("Calcular_Num_Pregunta")',
                        dataType: 'json',
                        data: { MProveeedorId:MProveeedorId, LicitacionId: LicitacionId },
                        success: function (response) {
                            alert(response);
                        },
                        error: function (response) {
                            alert(response);
                        }
                    });
                }
            }


    y en el controlador

      public JsonResult Calcular_Num_Pregunta(int MProveeedorId, int LicitacionId)
            {
                var NumPregunta = from p in db.Preguntas
                                where (p.MPROVEEDORID == MProveeedorId)
                                  && (p.LICITACIONID == LicitacionId)                            
                                select p.NUMPREGUNTA;            
    
                if (NumPregunta != null)
                {
                    var Pregunta = new PREGUNTAS(){
                       NUMPREGUNTA=1,
                    };
    
                }
                else {
                    var Pregunta = new PREGUNTAS()
                    {
                        NUMPREGUNTA =  + 1,
                    };                
                }
    
                NumPregunta = Pregunta;
                                  
                return Json(NumPregunta);
            }

    que quiero hacer sacar el ultimo registro y si no existe poner en un @Html.EditorFor el numero 1; y si existe sumar el 1 al registro y ponerlo en  @Html.EditorFor.

    algo asi como esto

    SELECT  MAX(NUMPREGUNTA) AS MAX FROM PREGUNTAS
    			WHERE LICITACIONID=@LICITACIONID AND PROVEEDORID=@PROVEEDORID

    pero ahora con linq.

    de antemano muchas gracias.


    Horacio Xochitemol Bautista

    lunes, 11 de julio de 2016 17:33

Respuestas

  • Listo amigos; gracias Avatar de Leandro TuttiniLeandroAvatar de Willams MoralesWillams ;

    les comento quedo de la siguiente manera: en el controlador,

    public JsonResult Calcular_Num_Pregunta(int MProveeedorId, int LicitacionId)
            {
                int? NumPregunta = db.Preguntas
                               .Where(x => x.MPROVEEDORID == MProveeedorId && x.LICITACIONID == LicitacionId)
                               .Select(x => x.NUMPREGUNTA)
                               .DefaultIfEmpty().Max();
    
                if (NumPregunta == null)
                    {
                        NumPregunta = 0;
                    }
                               
                 return Json((int)NumPregunta + 1, JsonRequestBehavior.AllowGet);
            }

    y en la vista este es el codigo del script

    <script type="text/javascript">
        $(document).ready(function () {
            $("#LICITACIONID").change(function () {
                $("#NUMERALID").empty();
    
                var MProveeedorId = $("#MPROVEEDORID").val();
                var LicitacionId = $("#LICITACIONID").val();
                Calcular_Num_Pregunta(MProveeedorId, LicitacionId);
    
                $.ajax({
                    type: 'POST',
                    url: '@Url.Action("ObtenerNumerales")',
                        dataType: 'json',
                        data: { LicitacionId: $("#LICITACIONID").val() },
                        success: function (numerales) {                       
                            $.each(numerales, function (i, numeral) {
                                $("#NUMERALID").append('<option value="'
                                    + numeral.NUMERALID + '">'
                                    + numeral.DESCRIPCIONNUMERAL + '</option>');
                            });                       
                        },
                        error: function (ex) {
                            alert('Error al Cargar los Numerales del Procedimiento: ' + ex);
                        }
                    });
                    return false
                })
            });
    
            /*Evento que se activa al cambiar el Proveedor*/
            $(document).ready(function () {
                $("#MPROVEEDORID").change(function () {                
                    try {
                        var MProveeedorId = $("#MPROVEEDORID").val();
                        var LicitacionId = $("#LICITACIONID").val();
                        Calcular_Num_Pregunta(MProveeedorId, LicitacionId);
    
                    } catch (e) {
                        alert(e.name + "\n" + e.message)
                    }
                })
            });
    
            /*Funcion para Calcular el Numero de Pregunta que le corresponde al Proveedor y al Evento*/
            function Calcular_Num_Pregunta(MProveeedorId, LicitacionId) {
                try {
                    if (MProveeedorId > 0 && LicitacionId > 0) {
                        //alert("Proveedor; " + MProveeedorId + "\n Procedimiento de Contratación:"+ LicitacionId);
                        $.ajax({
                            type: 'POST',
                            url: '@Url.Action("Calcular_Num_Pregunta")',
                            dataType: 'json',
                            data: { MProveeedorId: MProveeedorId, LicitacionId: LicitacionId },
                            success: function (response) {                            
                                var resultado = response;                            
                                $("#NUMPREGUNTA").val(resultado);
                               // alert(response);
                            },
                            error: function (response) {
                                alert(response);
                            }
                        });
                    }
    
                } catch (e) {
                    alert(e.name + "\n" + e.message)
                }           
            }
    
        </script>   

    lo que cambie fue que en el controlador valide que Numpregunta  no sea nulo y si es nulo lo pongo en 0 , y en el json obtuve el resultado en una variable.

    muchas gracias


    Horacio Xochitemol Bautista

    • Marcado como respuesta Xochitemol lunes, 11 de julio de 2016 22:27
    lunes, 11 de julio de 2016 22:27

Todas las respuestas

  • hola

    podrias ayudarte con el Max() o Any() para validar la existencia de datos y calcular el maximo de un valor

    public JsonResult Calcular_Num_Pregunta(int MProveeedorId, int LicitacionId)
    {
    	var exists = db.Preguntas.Any(p=> p.MPROVEEDORID == MProveeedorId)
    										&& (p.LICITACIONID == LicitacionId));
    											
    	var Pregunta = new PREGUNTAS(){
    		   NUMPREGUNTA = 1,
    		};
    		
    	if (exists)
    	{
    		var NumPregunta = db.Preguntas.Where(p=> p.MPROVEEDORID == MProveeedorId)
    											&& (p.LICITACIONID == LicitacionId))
    									.Max(p=> p.NUMPREGUNTA); 
    		Pregunta = new PREGUNTAS()
    		{
    			NUMPREGUNTA = NumPregunta + 1,
    		};                
    	}
    					  
    	return Json(NumPregunta);
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 11 de julio de 2016 17:54
  • Xochitemol,

    Puedes implementar el método de acción Calcular_Num_Pregunta() de la siguiente manera:

    public JsonResult Calcular_Num_Pregunta(int MProveeedorId, int LicitacionId)
    {
            int NumPregunta = db.Preguntas
                                .Where(x => x.MPROVEEDORID == MProveeedorId && x.LICITACIONID == LicitacionId)
                                .Select(x => x.NUMPREGUNTA)
                                .DefaultIfEmpty().Max();
    
            return Json(NumPregunta + 1, JsonRequestBehavior.AllowGet);
    }

    Espero que la información proporcionada le haya sido de utilidad.

    lunes, 11 de julio de 2016 18:20
  • hola  amigos le comento lo hice como indico williams; sin embargo ahora cada que cambio una opcion de los 2 Dropdownlist me manda el siguiente mensaj

    ya hice un debugger pero no me indica nada; sabran a que se debe el error muchas gracias como siempre; quedo asi.

    <script type="text/javascript"> $(document).ready(function () { $("#LICITACIONID").change(function () { $("#NUMERALID").empty();

    var MProveeedorId = $("#MPROVEEDORID").val(); var LicitacionId = $("#LICITACIONID").val(); Calcular_Num_Pregunta(MProveeedorId, LicitacionId); $.ajax({ type: 'POST', url: '@Url.Action("ObtenerNumerales")', dataType: 'json', data: { LicitacionId: $("#LICITACIONID").val() }, success: function (numerales) { $.each(numerales, function (i, numeral) { $("#NUMERALID").append('<option value="' + numeral.NUMERALID + '">' + numeral.DESCRIPCIONNUMERAL + '</option>'); }); }, error: function (ex) { alert('Error al Cargar los Numerales del Procedimiento: ' + ex); } }); return false }) }); /*Evento que se activa al cambiar el Proveedor*/ $(document).ready(function () { $("#MPROVEEDORID").change(function () { debugger; try { var MProveeedorId = $("#MPROVEEDORID").val(); var LicitacionId = $("#LICITACIONID").val(); Calcular_Num_Pregunta(MProveeedorId, LicitacionId); } catch (e) { alert(e.name + "\n" + e.message) } }) }); /*Funcion para Calcular el Numero de Pregunta que le corresponde al Proveedor y al Evento*/ function Calcular_Num_Pregunta(MProveeedorId, LicitacionId) { try { if (MProveeedorId > 0 && LicitacionId > 0) { //alert("Proveedor; " + MProveeedorId + "\n Procedimiento de Contratación:"+ LicitacionId); $.ajax({ type: 'POST', url: '@Url.Action("Calcular_Num_Pregunta")', dataType: 'json', data: { MProveeedorId: MProveeedorId, LicitacionId: LicitacionId }, success: function (response) { alert(response); }, error: function (response) { alert(response); } }); } } catch (e) { alert(e.name + "\n" + e.message) } } </script>



    Horacio Xochitemol Bautista

    lunes, 11 de julio de 2016 19:44
  • Xochitemol,

    ¿Has realizado alguna modificación al método de acción propuesto? ¿Podrías compartir el código del método?

    ¿Has validado que el método de acción este retornando el valor esperado?

          return Json(NumPregunta + 1, JsonRequestBehavior.AllowGet);
    } --> Colocar punto de interrupción

    Coloca un punto de interrupción en el lugar indicado y lee el valor que toma la variable NumPregunta. 

    Por otro lado, la llamada HTTP debería ser GET.

    $.ajax({
                            type: 'GET',
                            url: '@Url.Action("Calcular_Num_Pregunta")',
                            dataType: 'json',

    Coméntanos como te fue.

    lunes, 11 de julio de 2016 20:48
  • el metodo

     public JsonResult Calcular_Num_Pregunta(int MProveeedorId, int LicitacionId)
            {
                int? NumPregunta = db.Preguntas
                               .Where(x => x.MPROVEEDORID == MProveeedorId && x.LICITACIONID == LicitacionId)
                               .Select(x => x.NUMPREGUNTA)
                               .DefaultIfEmpty().Max();
                                              
                 return Json(NumPregunta + 1, JsonRequestBehavior.AllowGet);
            }
    solo puse que el valor de NumPregunta puede ser vacio; no se hecho cambios relevantes


    Horacio Xochitemol Bautista

    lunes, 11 de julio de 2016 21:48
  • que browser estas utilizando ?

    porque podrias usar el Developer Tools, al cual accedes con F12 y poner un breakpoint en el codigo javascript

    especialmente para ver que devuelve "response", porque puede que tengas que usar

     alert(response.d);

    o response.data

    pero para eso deberias poder inspeccionar la variable cuando llega al cliente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 11 de julio de 2016 22:00
  • Listo amigos; gracias Avatar de Leandro TuttiniLeandroAvatar de Willams MoralesWillams ;

    les comento quedo de la siguiente manera: en el controlador,

    public JsonResult Calcular_Num_Pregunta(int MProveeedorId, int LicitacionId)
            {
                int? NumPregunta = db.Preguntas
                               .Where(x => x.MPROVEEDORID == MProveeedorId && x.LICITACIONID == LicitacionId)
                               .Select(x => x.NUMPREGUNTA)
                               .DefaultIfEmpty().Max();
    
                if (NumPregunta == null)
                    {
                        NumPregunta = 0;
                    }
                               
                 return Json((int)NumPregunta + 1, JsonRequestBehavior.AllowGet);
            }

    y en la vista este es el codigo del script

    <script type="text/javascript">
        $(document).ready(function () {
            $("#LICITACIONID").change(function () {
                $("#NUMERALID").empty();
    
                var MProveeedorId = $("#MPROVEEDORID").val();
                var LicitacionId = $("#LICITACIONID").val();
                Calcular_Num_Pregunta(MProveeedorId, LicitacionId);
    
                $.ajax({
                    type: 'POST',
                    url: '@Url.Action("ObtenerNumerales")',
                        dataType: 'json',
                        data: { LicitacionId: $("#LICITACIONID").val() },
                        success: function (numerales) {                       
                            $.each(numerales, function (i, numeral) {
                                $("#NUMERALID").append('<option value="'
                                    + numeral.NUMERALID + '">'
                                    + numeral.DESCRIPCIONNUMERAL + '</option>');
                            });                       
                        },
                        error: function (ex) {
                            alert('Error al Cargar los Numerales del Procedimiento: ' + ex);
                        }
                    });
                    return false
                })
            });
    
            /*Evento que se activa al cambiar el Proveedor*/
            $(document).ready(function () {
                $("#MPROVEEDORID").change(function () {                
                    try {
                        var MProveeedorId = $("#MPROVEEDORID").val();
                        var LicitacionId = $("#LICITACIONID").val();
                        Calcular_Num_Pregunta(MProveeedorId, LicitacionId);
    
                    } catch (e) {
                        alert(e.name + "\n" + e.message)
                    }
                })
            });
    
            /*Funcion para Calcular el Numero de Pregunta que le corresponde al Proveedor y al Evento*/
            function Calcular_Num_Pregunta(MProveeedorId, LicitacionId) {
                try {
                    if (MProveeedorId > 0 && LicitacionId > 0) {
                        //alert("Proveedor; " + MProveeedorId + "\n Procedimiento de Contratación:"+ LicitacionId);
                        $.ajax({
                            type: 'POST',
                            url: '@Url.Action("Calcular_Num_Pregunta")',
                            dataType: 'json',
                            data: { MProveeedorId: MProveeedorId, LicitacionId: LicitacionId },
                            success: function (response) {                            
                                var resultado = response;                            
                                $("#NUMPREGUNTA").val(resultado);
                               // alert(response);
                            },
                            error: function (response) {
                                alert(response);
                            }
                        });
                    }
    
                } catch (e) {
                    alert(e.name + "\n" + e.message)
                }           
            }
    
        </script>   

    lo que cambie fue que en el controlador valide que Numpregunta  no sea nulo y si es nulo lo pongo en 0 , y en el json obtuve el resultado en una variable.

    muchas gracias


    Horacio Xochitemol Bautista

    • Marcado como respuesta Xochitemol lunes, 11 de julio de 2016 22:27
    lunes, 11 de julio de 2016 22:27
  • Xochitemol,

    Siendo que la secuencia retorna el valor máximo de la propiedad NUMPREGUNTA (tipo numérico), uso el método DefaultIfEmpty() para obtener el valor predeterminado para el tipo en caso no exista un valor para la secuencia, por tanto, la consulta -S.E.U.O.-  nunca debería retornar null, no hay necesidad de definir una variable Nullable.

    public JsonResult Calcular_Num_Pregunta(int MProveeedorId, int LicitacionId)
    {
            int NumPregunta = db.Preguntas
                                .Where(x => x.MPROVEEDORID == MProveeedorId && x.LICITACIONID == LicitacionId)
                                .Select(x => x.NUMPREGUNTA)
                                .DefaultIfEmpty().Max();
    
            return Json((NumPregunta + 1), JsonRequestBehavior.AllowGet);
    }

    Puedes colocar un punto de interrupción para validar el contenido de la expresión.

    martes, 12 de julio de 2016 4:21
  • int numpregunta me regresaba null cuando  no existe registro; es por ello que no puse lo definí nullable.

    saludos.


    Horacio Xochitemol Bautista

    martes, 12 de julio de 2016 16:48