Por que não posso foreach através do meu ViewData ou modelo?
-
10-07-2019 - |
Pergunta
Eu continuo recebendo erros tentando iterate através do meu ViewData na vista lá ... Eu até tentei fortemente digitando o fim de IEnumerable (App.Models.Namespace) e usando modelo, sem sucesso. Ou eu recebo um erro por falta de um método GetEnumerable ou tipo inválido fundição ... Alguma idéia de como eu faço isso?
Modelo ...
public IQueryable<Product> getAllProducts()
{
return (from p in db.Products select p);
}
Controlador ...
public ActionResult Pricing()
{
IQueryable<Product> products = orderRepository.getAllProducts();
ViewData["products"] = products.ToList();
return View();
}
View ...
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Pricing
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Pricing</h2>
<div>
<select class="product">
<%foreach(var prod in ViewData["products"]){%>
<option><%=prod.Title %></option>
<%} %>
</select><select></select>
</div>
</asp:Content>
Solução
Tente isto com o elenco:
foreach(var prod in (List<Product>)ViewData["products"])
Outras dicas
foreach (var prod in (ViewData["products"] as IEnumerable<Product>))
eu entrei em uma situação semelhante e isso funcionou para mim.
Por que você está fazendo isso como este de qualquer maneira? Por que não fazer:
Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>
Na sua opinião. Então, em sua ação controlador de fazer:
public ActionResult Pricing()
{
IQueryable<Product> products = orderRepository.getAllProducts();
return View(products.ToList(););
}
Em seguida, você não tem que usar ViewData
em tudo.
<%foreach(Product prod in ViewData["products"]){%>
foreach(var prod in ViewData["products"] as IQueryable<Product>)
Se você está recebendo lista de mais de dois modelo e quer mostrar dois modelos em um lista do que você deve usar como esta .. Criar o seu modelo dois primeiros é estudante e segundo é Professor.
// Create Models
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public List<int> Marks { get; set; }
}
public class Teacher
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
// Cria controlador
public ActionResult Index()
{
List<Student> students = new List<Student>()
{
new Student {Id = 1, Name = "Vikas", Address = "Mohali", Marks = new List<int> {90, 23, 46,56} },
new Student {Id = 2, Name = "Rajeev", Address = "Mohali", Marks = new List<int> { 56, 78, 34, 67 }},
new Student {Id = 3, Name = "Ajay", Address = "Delhi", Marks = new List<int> {56, 78, 34, 56}}
};
List<Teacher> teachers = new List<Teacher>()
{
new Teacher {Id = 1, Name = "Arun Nagar", Address = "Delhi"},
new Teacher {Id = 2, Name = "Manish Kumar", Address = "Mohali"}
};
var Querylist = (from student in students
where student.Address == "Mohali"
select student.Name)
.Concat(from teacher in teachers
where teacher.Address == "Mohali"
select teacher.Name);
//get list in ViewBag
ViewBag.DataLIst = Querylist;
//get list in View Data
ViewData["DataLIst1"] = Querylist.ToList();
return View(Querylist.AsEnumerable());
}
//create View "Index.cshtml"
@foreach (var h in @ViewBag.DataLIst)
{
<h3>@h</h3>
}
@foreach (var s in @ViewData["DataLIst1"] as List< string>)
{
<h1>@s</h1>
}