¿Por qué no puedo predecir a través de mi ViewData o Modelo?
-
10-07-2019 - |
Pregunta
Sigo recibiendo errores al intentar iterar a través de mi ViewData en la vista allí ... Incluso intenté escribir la vista en IEnumerable (App.Models.Namespace) y usar Model, sin resultado. O recibo un error por falta de un método GetEnumerable o conversión de tipo no válida ... ¿Alguna idea de cómo hago esto?
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();
}
Ver ...
<%@ 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>
Solución
Prueba esto con el elenco:
foreach(var prod in (List<Product>)ViewData["products"])
Otros consejos
foreach (var prod in (ViewData["products"] as IEnumerable<Product>))
Me metí en una situación similar y esto funcionó para mí.
¿Por qué lo haces así de todos modos? Por qué no hacer:
Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>
en su opinión. Luego, en la acción de su controlador, haga:
public ActionResult Pricing()
{
IQueryable<Product> products = orderRepository.getAllProducts();
return View(products.ToList(););
}
Entonces no tiene que usar ViewData
en absoluto.
<%foreach(Product prod in ViewData["products"]){%>
foreach(var prod in ViewData["products"] as IQueryable<Product>)
Si está obteniendo una lista de más de dos modelos y desea mostrar dos modelos en una lista, debe usar así. Crea tus dos modelos primero es Estudiante y segundo es Profesor.
// 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; }
}
// Crear 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>
}