没有键为“Conve”的“IEnumerable”类型的 ViewData 项

Posted

技术标签:

【中文标题】没有键为“Conve”的“IEnumerable”类型的 ViewData 项【英文标题】:There is no ViewData item of type 'IEnumerable' that has the key 'Conve' 【发布时间】:2021-07-09 16:00:14 【问题描述】:

我正在对应用程序进行调整并进行更新。它向我抛出以下错误:

没有具有键“Conve”的“IEnumerable”类型的 ViewData 项。

我的 DropDownList 完美加载数据,但是当我选择该列表中的任何一个以使用其值并将其更改为我的 BD 中的值时,它会引发该错误

模型:TableAsign.cs

public class TableAsign

    public long IdCliente  get; set; 
    public string nombre  get; set; 

控制器:MastController.cs

[Authorize]
public ActionResult Asign_Conv(int idUsuario)

    List<Models.TableAsign> lst = null;
    using (TPConveniosEntities db = new TPConveniosEntities())
    
        lst = (from d in db.Cliente
               orderby d.nombre
               select new TableAsign
               
                   IdCliente = d.idCliente,
                   nombre = d.nombre
               ).ToList();
    
    List<SelectListItem> items = lst.ConvertAll(d =>
       return new SelectListItem()
           Text = d.nombre.ToString(),
            Value = d.IdCliente.ToString(),
            Selected = false
        ;
    );

    ViewBag.items = items;

    using (TPConveniosEntities db = new TPConveniosEntities())
    
        Usuario user = db.Usuario.FirstOrDefault(u => u.idUsuario == idUsuario);
        return View(user);
    
 

在这部分中,它执行 UPDATE,在我看来,当我将 DropDownList 的值与我的 long 一起带来时,它必须这样做strong> 变量,它会抛出错误,然后当我咨询我的数据库时,我看到它是否执行 UPDATE 但给了我该错误

[Authorize]
[HttpPost]
public ActionResult Asign_Conv(FormCollection collection)

    using (TPConveniosEntities contexto = new TPConveniosEntities())
    
        var idUsuario = Convert.ToInt32(collection["IdUsuario"].Trim());
        Usuario user = contexto.Usuario.FirstOrDefault(u => u.idUsuario == idUsuario);

        var userName = collection["usuario"].Trim();
        long IdCliente = Convert.ToInt32(collection["Convenio"].Trim());

        user.userName = userName;
        user.idCliente = IdCliente;

        contexto.SaveChanges();
        return View(user);
    

查看:Asign_Conv.cshtml

@using TPConvenios.App_Data;
@model Usuario
@
    Layout = null;
    AjaxOptions ajaxOpciones = new AjaxOptions
    
        UpdateTargetId = "cuerpoPopUpGenerico2",
        InsertionMode = InsertionMode.Replace,
        OnSuccess = "OnSuccess_Asign",
        OnFailure = "OnFailure"
    ;
    List<SelectListItem> items = (List<SelectListItem>)ViewBag.items;

<div id="contenedor" style="margin: 15px 30px">
    @using (Ajax.BeginForm("Asign_Conv", "Mast", null, ajaxOpciones, new  id = "Asign_Conv" ))
      @Html.ValidationSummary(true);
     <input type="hidden" name="idUsuario" id="idUsuario" value="@(null != Model ? Model.idUsuario : 0)" />
     <p>
       <input name="usuario" type="text" id="usuario" class="usuario" placeholder="Usuario" value="@(null != Model ? Model.userName : String.Empty)"/>
     </p>
     <p>
       @Html.DropDownList("Convenio", items, "Seleccione el Convenio", new  @class = "form-control" )
     </p>
     <p id="bot">
     <input name="submit" type="submit" id="submit" value="Asignar" class="botonNuevo" style="float: right" />
     </p>
    
</div>

【问题讨论】:

【参考方案1】:

我设法解决了我的问题,方法是将加载 DropdownList 时使用的代码粘贴到执行 UPDATE 的 POST 中。

保持这种状态

    [Authorize]
    [HttpPost]
    public ActionResult Asign_Conv(FormCollection collection)
   
        using (TPConveniosEntities contexto = new TPConveniosEntities())
        
            var idUsuario = Convert.ToInt32(collection["IdUsuario"].Trim());
            Usuario user = contexto.Usuario.FirstOrDefault(u => u.idUsuario == idUsuario);

            var userName = collection["usuario"].Trim();
            long IDCliente = Convert.ToInt32(collection["Conve"].Trim());
           
            /*********** ESTO FUE LO QUE COPIE PARA QUE FUNCIONARA **********/
            
                List<Models.TableAsign> lst = null;
                using (TPConveniosEntities db = new TPConveniosEntities())
                
                    lst = (from d in db.Cliente
                           orderby d.nombre
                           select new TableAsign
                           
                               IdCliente = d.idCliente,
                               nombre = d.nombre
                           ).ToList();
                
                List<SelectListItem> items = lst.ConvertAll(d =>
                
                    return new SelectListItem()
                    
                        Text = d.nombre.ToString(),
                        Value = d.IdCliente.ToString(),
                        Selected = false
                    ;
                );
                ViewBag.items = items;

               /***************************   HASTA AQUI   **********************/
                user.userName = userName;
                user.idCliente = IDCliente;
                contexto.SaveChanges();
 
                return View(user);
            
        

【讨论】:

以上是关于没有键为“Conve”的“IEnumerable”类型的 ViewData 项的主要内容,如果未能解决你的问题,请参考以下文章

IEnumerable 没有 Count 方法

没有具有键 'xxx' 的 'IEnumerable<SelectListItem>' 类型的 ViewData 项

当类没有实现 IEnumerable 时,GetEnumerator 方法是不是仍然是幂等的

为啥我的 DisplayFor 没有循环通过我的 IEnumerable<DateTime>?

无法使用集合初始化程序初始化类型“”,因为它没有实现“System.Collections.IEnumerable”

c# IeNumerable 如果没有则返回[重复]