none
ViewBag no reconoce el elemto al darle en submit RRS feed

  • Pregunta

  • Buenas tardes, necesito su ayuda... Estoy enviendo un viwebag desde el controlador a la vista para editar información, la vista me carga sin problema y me muestra los datos en pantalla correctamente y puedo manipularlos e incluso me hace el ddl en cascada, esta es la forma en la que recupero la información de la base de datos y lleno el viewbag

     var tipoDepe = dependenciasRepository.GetDependenciasTipo(id_Entidad);
                    List<TipoDependencia> TipoDeplst = new List<TipoDependencia>();
                    foreach (var item in tipoDepe)
                    {
                        TipoDependencia TD = new TipoDependencia();
                        TD.ID_Dependencia = item.ID_Dependencia;
                        TD.Nombre = item.Nombre;
                        TipoDeplst.Add(TD);

                    }
                    List<SelectListItem> _TipoDependencia = TipoDeplst.ConvertAll(d =>
                    {
                        return new SelectListItem()
                        {
                            Text = d.Nombre.ToString(),
                            Value = d.ID_Dependencia.ToString(),
                            Selected = (d.ID_Dependencia == dependencia.Parent_ID)
                        };

                    });
                    ViewBag.TipoEntidades = _TipoDependencia;

    tengo el siguiente código en los dll, utilizo 3 ejemplos, los 3 me traen la información correcta

    <div class="form-group">

                                            @Html.DropDownList("Parent_ID", (IEnumerable<SelectListItem>)ViewBag.TipoEntidades,
                                           "-- NO APLICA -- Es una dependencia de primer nivel.", new { @class = "form-control", @onchange = "InvocaCargo(this.value)" })
                                            @Html.ValidationMessageFor(model => model.Parent_ID, "", new { @class = "data-parsley-validate" })

                                            @*@Html.DropDownList("Parent_ID", ViewBag.TipoEntidades as List<SelectListItem>,
                                          "-- NO APLICA -- Es una dependencia de primer nivel.", new { @class = "form-control", @onchange = "InvocaCargo(this.value)" })
                                            @Html.ValidationMessageFor(model => model.Parent_ID, "", new { @class = "data-parsley-validate" })*@

                                            @* @Html.DropDownList("Parent_Id", dependenciaPadre, "-- NO APLICA -- Es una dependencia de primer nivel.", new { @class = "form-control", @onchange = "InvocaCargo(this.value)" } )*@
                                        </div>


    Me deja manipular los y todo parece estar bien con la vista, mi problema radica al momento de hacer el submit, me sale una excepción y no he podido dar con el problema, a pesar de tener las claves en su lugar

    System.InvalidOperationException: 'No hay ningún elemento ViewData de tipo 'IEnumerable<SelectListItem>' con la clave 'Parent_ID'.'

    System.InvalidOperationException
      HResult=0x80131509
      Mensaje = No hay ningún elemento ViewData de tipo 'IEnumerable<SelectListItem>' con la clave 'Parent_ID'.
      Origen = System.Web.Mvc
      Seguimiento de la pila:
       en System.Web.Mvc.Html.SelectExtensions.GetSelectData(HtmlHelper htmlHelper, String name)
       en System.Web.Mvc.Html.SelectExtensions.SelectInternal(HtmlHelper htmlHelper, ModelMetadata metadata, String optionLabel, String name, IEnumerable`1 selectList, Boolean allowMultiple, IDictionary`2 htmlAttributes)
       en System.Web.Mvc.Html.SelectExtensions.DropDownList(HtmlHelper htmlHelper, String name, IEnumerable`1 selectList, String optionLabel, Object htmlAttributes)
       en ASP._Page_Views_Dependencias_Edit_cshtml.Execute() en T:\Altic\GobticV2\PlataformaPD\PlataformaPD.Web\Views\Dependencias\Edit.cshtml: línea 76
       en System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
       en System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
       en System.Web.WebPages.StartPage.RunPage()
       en System.Web.WebPages.StartPage.ExecutePageHierarchy()
       en System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
       en System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
       en System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
       en System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
       en System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
       en System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
       en System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)

    Espero que alguién pueda sacarme de la duda, quedó atento

    miércoles, 9 de septiembre de 2020 22:00

Respuestas

  • Seguramente la vista la estás sirviendo desde el método "Index" u otro similar, que es el que carga de datos el ViewBag y después hace "return View()". Esto funciona bien, y la vista se presenta correctamente porque tiene el ViewBag cargado de datos.

    Pero cuando pulsas el Submit, no va a parar al método Index, sino al método Edit (u otro similar que hayas configurado). Si revisas el método en cuestión, casi seguro que te encontrarás que no carga los mismos datos en el ViewBag. Por lo tanto, cuando este segundo método hace "return View()" y se intenta renderizar la vista, se produce el error que estás viendo en el momento de cargar de datos el dropdown desde el ViewBag, porque en esta ocasión el ViewBag no trae los datos para el DropDown.

    La solución es cargar el ViewBag en todos los métodos del controlador que devuelvan alguna vista que lo necesite. Puedes mover a una subrutina esa carga del ViewBag y llamar a la subrutina desde todos los métodos de acción afectados.

    • Marcado como respuesta EricRRModerator sábado, 12 de septiembre de 2020 0:50
    viernes, 11 de septiembre de 2020 15:11

Todas las respuestas

  • Hola Santo, 

      

    Gracias por levantar tu consulta en los foros de MSDN.

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.   

    Eric Ruiz

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    jueves, 10 de septiembre de 2020 0:11
    Moderador
  • Seguramente la vista la estás sirviendo desde el método "Index" u otro similar, que es el que carga de datos el ViewBag y después hace "return View()". Esto funciona bien, y la vista se presenta correctamente porque tiene el ViewBag cargado de datos.

    Pero cuando pulsas el Submit, no va a parar al método Index, sino al método Edit (u otro similar que hayas configurado). Si revisas el método en cuestión, casi seguro que te encontrarás que no carga los mismos datos en el ViewBag. Por lo tanto, cuando este segundo método hace "return View()" y se intenta renderizar la vista, se produce el error que estás viendo en el momento de cargar de datos el dropdown desde el ViewBag, porque en esta ocasión el ViewBag no trae los datos para el DropDown.

    La solución es cargar el ViewBag en todos los métodos del controlador que devuelvan alguna vista que lo necesite. Puedes mover a una subrutina esa carga del ViewBag y llamar a la subrutina desde todos los métodos de acción afectados.

    • Marcado como respuesta EricRRModerator sábado, 12 de septiembre de 2020 0:50
    viernes, 11 de septiembre de 2020 15:11