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>
Foi útil?

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>
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top