Warum kann ich nicht durch meine Viewdata oder Modell foreach?
-
10-07-2019 - |
Frage
Ich erhalte Fehler versuchen, es durch meine Viewdata in der Ansicht iterieren ... Ich habe sogar versucht stark die Ansicht zu IEnumerable (App.Models.Namespace) eingeben und Modell verwenden, ohne Erfolg. Entweder ich erhalte eine Fehlermeldung aus Mangel an einer GetEnumerable Methode oder ungültig type casting ... Jede Idee, wie ich das tun?
Modell ...
public IQueryable<Product> getAllProducts()
{
return (from p in db.Products select p);
}
Controller ...
public ActionResult Pricing()
{
IQueryable<Product> products = orderRepository.getAllProducts();
ViewData["products"] = products.ToList();
return View();
}
Ansicht ...
<%@ 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>
Lösung
Versuchen Sie dies mit der Besetzung:
foreach(var prod in (List<Product>)ViewData["products"])
Andere Tipps
foreach (var prod in (ViewData["products"] as IEnumerable<Product>))
Ich habe in einer ähnlichen Situation und das funktionierte für mich.
Warum sind Sie es so ohnehin tun? Warum nicht tun:
Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>
in der Ansicht. Dann in Ihrer Controller-Aktion zu tun:
public ActionResult Pricing()
{
IQueryable<Product> products = orderRepository.getAllProducts();
return View(products.ToList(););
}
Dann müssen Sie nicht ViewData
überhaupt.
<%foreach(Product prod in ViewData["products"]){%>
foreach(var prod in ViewData["products"] as IQueryable<Product>)
Wenn Sie Liste erhalten von mehr als zwei Modell und wollen in einer Liste zwei Modell zeigen, als Sie wie folgt verwenden sollte .. Erstellen Sie Ihr Modell zwei erste ist für Studenten und zweite ist Lehrer.
// 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; }
}
// erstellen Controller
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>
}