Question

Je continue à avoir des erreurs en essayant de parcourir mes ViewData dans la vue là-bas ... J'ai même essayé de taper fortement la vue sur IEnumerable (App.Models.Namespace) et d'utiliser Model, en vain. Soit je reçois une erreur faute d’une méthode GetEnumerable ou une conversion de type non valide ... Vous avez une idée de la procédure à suivre?

Modèle ...

public IQueryable<Product> getAllProducts()
{
    return (from p in db.Products select p);
}

Contrôleur ...

public ActionResult Pricing()
{
    IQueryable<Product> products = orderRepository.getAllProducts();

    ViewData["products"] = products.ToList();

    return View();
}

Voir ...

<%@ 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>
Était-ce utile?

La solution

Essayez ceci avec le casting:

foreach(var prod in (List<Product>)ViewData["products"])

Autres conseils

foreach (var prod in (ViewData["products"] as IEnumerable<Product>))

Je me suis retrouvé dans une situation similaire et cela a fonctionné pour moi.

Pourquoi faites-vous comme ça quand même? Pourquoi ne pas faire:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>

à votre avis. Ensuite, dans votre action de contrôleur, faites:

public ActionResult Pricing()
{
    IQueryable<Product> products = orderRepository.getAllProducts();
    return View(products.ToList(););
}

Vous n'êtes donc pas obligé d'utiliser ViewData .

<%foreach(Product prod in ViewData["products"]){%>
foreach(var prod in ViewData["products"] as IQueryable<Product>)

Si vous obtenez une liste de plus de deux modèles et souhaitez afficher deux modèles dans une liste, utilisez-le comme ceci. Créez vos deux modèles en premier est Student et en second est Teacher.

// 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; }
}

// Créer un contrôleur

  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>
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top