none
Consulta sobre validaciones. RRS feed

  • Pregunta

  • Hola que tal a todos, soy nuevo en este foro, quería hacer mi primer consulta, la cosa es así, tengo unas validaciones en dos vistas, en "crear" y "editar", la cuestión es que cuando en "crear" presiono el botón "guardar" y los datos requeridos están en blanco, me aparecen los carteles de error y validación correspondiente, pero tengo el problema en la vista "editar", la cual simplemente al ingresar a la pagina, los errores de validación y carteles aparecen todo el tiempo, es decir a penas se hace el GET a "editar" los mensajes de error y verificación aparece, si yo completo los campos desaparecen, es decir, luego funciona bien, pero los mensajes de validación no deberían aparecer al principio hasta que yo haga click en el botón guardar.

     

    las vistas son casi identicas, utilizan la misma entidad. gracias espero haber sido claro ja

    miércoles, 10 de diciembre de 2014 15:47

Todas las respuestas

  • Walter,

    Las reglas de validación que implementas en tus clases es para entre otras cosas mantener coherencia y dar soporte a las reglas del negocio (campos requeridos, expresiones, rangos, comparaciones, etc). Ahora, como es posible que pases a la vista EDIT con reglas no cumplidas en el CREATE?

    Es decir, el CREATE permitió campos vacíos que el EDIT advierte?. Creo que es un tema de percepción. 

    Espero haberte ayudado con mi respuesta, si te fue útil no olvides marcarla como correcta.

    miércoles, 10 de diciembre de 2014 15:57
  • hola

    >>los errores de validación y carteles aparecen todo el tiempo, es decir a penas se hace el GET a "editar" los mensajes de error y verificación aparece, si yo completo los campos desaparecen

    porque en el editar aparecen campos requeridos sin datos ?

    cuando editas se supone que recuperas la informacion de la entidad y los datos requeridos ya vienen con informacion (la informacion que ingresaste al crear)

    si lo haces de esta forma no deberia aprecer las validaciones, ahora si cargas un editar a medias y el usuario debe completar entonces esta claro que se van a lanzar las validaciones

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 10 de diciembre de 2014 16:16
  • no se como responder a varias personas a la vez, disculpen.

    la validación en el "create" funciona perfecto, ejemplo, cargo su nombre y su ip correctamente, se guarda, ahora yo voy a ver lo que guarde y tengo la opción de "editarlo", es decir me trae una pantalla con los datos "nombre" e "ip", el cual yo lo edito como quiero, ahi es cuando aparecen los carteles de verificación sin antes haber apretado "guardar", es decir la verificación la realizo para por ejemplo evitar que borren el nombre y pongan guardar con el nombre en blanco, la validación funciona porque NO me deja guardar, es decir no me deja hacer el submit, pero los carteles de verificación aparecieron antes de tiempo, antes de que apretara "guardar".

    antes de apretar "guardar" ya aparecen los mensajes de verificación, y son los mismos que para "Crear", nada mas que en la ventana crear, no aparecen a penas entro, aparecen cuando hago click en "guardar" y falta algun campo

    PD: Leandro Tuttine exelente tu blog, me gustaria aprender mas de MVC me podrias recomendar un libro o tutoriales de cero? gracias

    miércoles, 10 de diciembre de 2014 16:53
  • Walter, Lo que mencionas es que a pesar de que en tu vista EDIT los datos obligatorios estén cargados los mensajes de validación se muestran?.

    miércoles, 10 de diciembre de 2014 16:57
  • claro exacto, y suponte, el nombre es obligatorio, el mensaje de verificaciones se muestra, lo borro al nombre le escribo un nombre y paso al otro campo y el mensaje de verificación desaparece, borro el nombre y paso a otro campo y le mensaje de verificación aparce nuevamente, es decir funciona correctamente, y si borro el nombre y pongo "guardar" el cartel de verificación también aparece que me dice que falta el nombre

    basicamente el problema es que me aparece el cartel de verificacion antes de que yo apriete "guardar", aparece a penas se cargo la pagina entera de "edit". cosa que no pasa en Crear

    • Editado walterdequino miércoles, 10 de diciembre de 2014 17:01
    miércoles, 10 de diciembre de 2014 17:00
  • >>tengo la opción de "editarlo", es decir me trae una pantalla con los datos "nombre" e "ip", el cual yo lo edito como quiero, ahi es cuando aparecen los carteles de verificación sin antes haber apretado "guardar",

    como cargas el modelo desde el action y lo asignas a la view ?

    porque si lo haces directo las validaciones no deberian lanzarse y si lo hacen al tener datos no deberian mostrarse

    los datos no los cargas usando ajax o alguna tecnica similar no ?

    >>me gustaria aprender mas de MVC me podrias recomendar un libro o tutoriales de cero?

    es muy bueno el tutorial de MVA

    y tiene subtitulos en español

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 10 de diciembre de 2014 17:14
  • Controller: 

    public ActionResult Edit(Ubicacion u)
            {
                CargaComboEstado();
                ViewBag.cadenita = Manager.GetCadenaDireccion(Manager.GetUbicacion(u.Id).UbicacionPadre.Id);

                u = Manager.GetUbicacion(u.Id);
                if (u.EstadoUbicacion != null)
                {
                    CargaComboEstado(u.EstadoUbicacion.Id);
                }
                return View(u);
            }

    View:

    @model IdearPrintManager.Entidades.Ubicacion
    @{ ViewBag.Title = "Editar"; }

    <head>
        <script src="~/Scripts/jquery-1.9.1.min.js"></script>
        <script src="~/Scripts/jquery.mask.min.js" type="text/javascript"></script>
        <script>
            jQuery(function ($) {
                $("#SubRed").mask("999.999.999.999");
                $("#Broadcast").mask("999.999.999.999");
            });
        </script>
    </head>

    <div id="TituloPrincipal">
        <h2>Editar</h2>
    </div>

    @using (Html.BeginForm())
    {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend class="legend1">@ViewBag.cadenita</legend>
            <div class="UbicacionNombre">
                <h8>Nombre: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.Nombre, new {autocomplete ="off" })
            </div>
            <div class="UbicacionDireccion">
                <h8>Dirección: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.Direccion, new {autocomplete ="off" })
            </div>
            <div class="UbicacionCodigo">
                <h8>Código: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.Codigo, new {autocomplete ="off" })
            </div>
            <div class="UbicacionDireccionSubRed">
                <h8>Dirección SubRed: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.DireccionSubRed, new {id = "SubRed", placeholder ="xxx.xxx.xxx.xxx",autocomplete ="off" })
            </div>
            <div class="UbicacionDireccionBroadcast">
                <h8>Dirección Broadcast: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.DireccionBroadcast,new {id = "Broadcast", placeholder ="xxx.xxx.xxx.xxx",autocomplete ="off" })
            </div>
            <div class="contenedor2">
                <div class="UbicacionComentario">
                    <h8>Comentario: </h8>
                    <br />
                    <br />
                    @Html.TextBoxFor(model => model.Comentario, new {autocomplete ="off" })
                </div>
                <div class="UbicacionEstadoUbicacion">
                    <h8>Estado Ubicación: </h8>
                    <br />
                    <br />
                    @Html.DropDownList("EstadoId", ViewData["Estados"] as List<SelectListItem>)
                </div>
                @Html.HiddenFor(model => model.Id)
                @Html.HiddenFor(model => model.UbicacionPadre.Id)
                <div class="UbicacionGuardar">
                    <input type="submit" class="botoncito" value="Guardar" />
                </div>
                <div class="validation-summary-errors" style="">
                    <div class="validator">@ViewBag.Error</div>
                    <br />
                    <div class="validator">@Html.ValidationMessageFor(model => model.Nombre)</div>
                    <br />
                    <div class="validator">@Html.ValidationMessageFor(model => model.DireccionSubRed)</div>
                    <br /> 
                    <div class="validator">@Html.ValidationMessageFor(model => model.DireccionBroadcast)</div>
                    <br />
                </div>
            </div>
        </fieldset>
    }

    <p>@Html.ActionLink("Cancelar", "Index", new { id = Model.UbicacionPadre.Id }) </p>

    @section Scripts { @Scripts.Render("~/bundles/jqueryval") }

    la "create" es casi identica, es como que en el "edit" la verificación la esta haciendo constantemente en tiempo real, en cambio el "create" la verificación la hace recién al poner el botón "guardar"

    gracias por el tutorial, es genial!, ahora me voy a poner con ese tuto a ver que tal, si sabes alguno mas me avisas! sigo siempre tu blog!

    • Editado walterdequino miércoles, 10 de diciembre de 2014 17:23
    miércoles, 10 de diciembre de 2014 17:20
  • porque la edicion recibe un parametro

    public ActionResult Edit(Ubicacion u)

    la edicion con el [Httppost] podrias recibirlo, quizas este podrias necesitar el id de la entidadque se edita, pero no un objeto

    ademas llamas a CargaComboEstado() dos veces de forma diferentes, eso esta muy raro

    ----

    para que usas esto

                <div class="validation-summary-errors" style="">
                    <div class="validator">@ViewBag.Error</div>
                    <br />
                    <div class="validator">@Html.ValidationMessageFor(model => model.Nombre)</div>
                    <br />
                    <div class="validator">@Html.ValidationMessageFor(model => model.DireccionSubRed)</div>
                    <br /> 
                    <div class="validator">@Html.ValidationMessageFor(model => model.DireccionBroadcast)</div>
                    <br />
                </div>

    porque no solo defines un Html.ValidationSummary()

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 10 de diciembre de 2014 17:26
  • le paso el objeto porque luego se lo voy a pasar a la vista para cargar los combos correspondientes.

    y si lo de cargar combo se puede modificar se pensó de una forma rara y mal.

    .--

    para que usas esto

                <div class="validation-summary-errors" style="">
                    <div class="validator">@ViewBag.Error</div>
                    <br />
                    <div class="validator">@Html.ValidationMessageFor(model => model.Nombre)</div>
                    <br />
                    <div class="validator">@Html.ValidationMessageFor(model => model.DireccionSubRed)</div>
                    <br /> 
                    <div class="validator">@Html.ValidationMessageFor(model => model.DireccionBroadcast)</div>
                    <br />
                </div>

    porque no solo defines un Html.ValidationSummary()

    porque así lo uso en el "create" que funciona bien.. realmente estoy en CERO con el tema de validaciones.

    como dices que puedo hacer?, en el "create" esta de la misma manera y funciona como te digo, cuando haces click en "guardar" recién ahí aparecen los carteles de verificación si es que algún campo no se cargo. en editar aparece todo el tiempo y en tiempo real

    este es el "create" que funciona correctamente

    @model IdearPrintManager.Entidades.Ubicacion
    @{ ViewBag.Title = "Nueva Ubicacion"; Layout = "~/Views/Shared/_Layout.cshtml"; }

    <head>
        <script src="~/Scripts/jquery-1.9.1.min.js"></script>
        <script src="~/Scripts/jquery.mask.min.js" type="text/javascript"></script>
        <script>
            jQuery(function ($) {
                $("#SubRed").mask("999.999.999.999");
                $("#Broadcast").mask("999.999.999.999");
            });
        </script>
    </head>

    <div id="TituloPrincipal">
        <h2>Nueva Ubicación</h2>
    </div>

    @using (Html.BeginForm()) {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend class="legend1">@ViewBag.cadenita</legend>
            <div class="UbicacionNombre">
                <h8>Nombre: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.Nombre, new {autocomplete ="off" })
            </div>
            <div class="UbicacionDireccion">
                <h8>Dirección: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.Direccion, new {autocomplete ="off" })
            </div>
            <div class="UbicacionCodigo">
                <h8>Código: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.Codigo, new {autocomplete ="off" })
            </div>
            <div class="UbicacionDireccionSubRed">
                <h8>Dirección SubRed: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.DireccionSubRed, new {id = "SubRed", placeholder ="xxx.xxx.xxx.xxx",autocomplete ="off" })
            </div>
            <div class="UbicacionDireccionBroadcast">
                <h8>Dirección Broadcast: </h8>
                <br />
                <br />
                @Html.TextBoxFor(model => model.DireccionBroadcast, new {id = "Broadcast",placeholder ="xxx.xxx.xxx.xxx",autocomplete ="off"})
            </div>
            <div class="contenedor2">
                <div class="UbicacionComentario">
                    <h8>Comentario: </h8>
                    <br />
                    <br />
                    @Html.TextBoxFor(model => model.Comentario, new {autocomplete ="off" })
                </div>
                <div class="UbicacionEstadoUbicacion">
                    <h8>Estado Ubicación: </h8>
                    <br />
                    <br />
                    @Html.DropDownList("EstadoId", ViewData["Estados"] as List<SelectListItem>)
                </div>
                <div class="UbicacionGuardar">
                    <input type="submit" class="botoncito" value="Guardar" />
                </div>
            </div>
            <div class="validation-summary-errors">
                <div class="validator">@ViewBag.Error</div>
                <br />
                <div class="validator">@Html.ValidationMessageFor(model => model.Nombre)</div>
                <br />
                <div class="validator">@Html.ValidationMessageFor(model => model.DireccionSubRed)</div>
                <br /> 
                <div class="validator">@Html.ValidationMessageFor(model => model.DireccionBroadcast)</div>
                <br />
            </div>
            @if (ViewBag.Crear != null)
            {
                if (ViewBag.Crear)
                {
                    @Html.ActionLink("Cancelar", "ElegirUbicacion", new { id = ViewBag.IdActual })
                }
                else
                {
                    @Html.ActionLink("Cancelar", "ElegirUbicacion", new { id = ViewBag.ID })
                }
            }

        </fieldset>
    }
    @section Scripts { @Scripts.Render("~/bundles/jqueryval") }

    controller

           public ActionResult Create(int id, bool crear)
            {
                ViewBag.Crear = crear;
                ViewBag.cadenita = cadena;
                if (Manager.GetUbicacion(id).UbicacionPadre != null)
                    ViewBag.ID = Manager.GetUbicacion(padre).UbicacionPadre.Id;
                else
                    ViewBag.ID = Manager.GetUbicacion(padre);
                ViewBag.IdActual = id;
                CargaComboEstado();
                return View();
            }

    miércoles, 10 de diciembre de 2014 17:35
  • Walter,

    Te dejo un pequeño ejemplo de como cargo un dropdownlist desde el controlador y tbn su respectiva vista con vaidaciones por cada campo, no resumido. Espero te ayude

    CONTROLLER

    public ActionResult Create()
            {
                ModeloNeumatico modeloneumatico = new ModeloNeumatico();
                
                modeloneumatico.ModNDisponible = true; /*INICIALIZO ALGÚN CAMPO*/
    
                ViewBag.MarNID = new SelectList(db.MarcasNeumatico
                                                    .Where(MarN => MarN.MarNID == MarNID), "MarNID", "MarNMarca", 10 /*ITEM POR DEFECTO QUE CARGARÁ EL DROPDOWNLIST*/); /*ASÍ CARGO MI OBJETO DROPDOWLIST*/
    
                return View(modeloneumatico); /*ENVÍO MI ENTIDAD modeloneumatico cargada de datos inicializados y mis listas new SelectList*/
            }

    La vista

    @using (Html.BeginForm())
                {
                    @Html.ValidationSummary(true)
    
                    <fieldset>
                        <legend>ModeloNeumatico</legend>
            
                        <div class="editor-label required">
                            @Html.LabelFor(model => model.MarcasNeumatico.MarNMarca)
                        </div>
                        <div class="editor-field">
                            @Html.DropDownList("MarNID", String.Empty)
                            @Html.ValidationMessageFor(model => model.MarNID)
                        </div>		        
    
                        <div class="editor-label required">
                            @Html.LabelFor(model => model.ModNModelo)
                        </div>
                        <div class="editor-field">
                            @Html.TextBoxFor(model => model.ModNModelo, htmlAttributes: new { autofocus = "autofocus" })
                            @Html.ValidationMessageFor(model => model.ModNModelo)
                        </div>		        
    
    
                    </fieldset>
    
                    <div id="horizontal-line"></div>
                    
                    <input type="submit" id="submit-form" value="Guardar" />		        
                }

    Como puedes ver las validaciones las hago por campo.

    Espero haberte ayudado con mi respuesta, si te fue útil no olvides marcarla como correcta.

    miércoles, 10 de diciembre de 2014 17:49
  • si hago lo mismo, nada mas que las validaciones las puse separadas en un DIV, si hago lo que vos haces me aparecen lo mismo. 

    el problema es que en "create" las validaciones se hacen una vez apretado el boton "guardar"

    en cambio en "edit" las validaciones se hacen desde que la pagina se cargo, es decir el "get", y también en tiempo real. eso es lo que no puedo entender, a demás como podes ver, las vistas y controller son prácticamente iguales de ambos métodos

    EDITADO:

    Lo pude solucionar, en vez que el controller reciba un Objeto, recibí un id y luego obtuve el objeto. saludos gracias por su colaboración


    • Editado walterdequino miércoles, 10 de diciembre de 2014 18:31 Solucionado
    miércoles, 10 de diciembre de 2014 17:58