Tengo un controlador que es la construcción de una consulta de Linq to Sql para pasar a la ViewBag.los productos objeto. El problema es que no se puede circular usando un foreach en ella como me lo esperaba yo.

Aquí está el código en el controlador de la construcción de la consulta, con la .ToList() función a aplicar.

var products = from bundles in db.Bundle
    join bProducts in db.BundleProducts on bundles.bundleId equals bProducts.bundleID
    join product in db.Products on bProducts.productID equals product.productID
    join images in db.Images on product.productID equals images.productID
    where bundles.bundleInactiveDate > DateTime.Now
          select new {
              product.productName,
              product.productExcerpt,
              images.imageID,
              images.imageURL
           };
ViewBag.products = products.ToList();

Ya que estoy usando un modelo diferente en el Índice.cshtml para otros elementos necesarios, pensé que un simple Html.Parcial podría ser utilizado para incluir el viewbag de bucle. He probado con el mismo resultado con y sin el uso de la parcial y simplemente por el uso de foreach en el índice.cshtml. Un fragmento que incluye el parcial es el siguiente:

<div id="bundle_products">
<!--build out individual product icons/descriptions here--->
@Html.Partial("_homeBundle")
</div>

En mi _homeBundle.cshtml archivo tengo los siguientes:

@foreach (var item in ViewBag.products)
{ 
    @item
}

Estoy recibiendo el ViewBag de datos, pero me estoy haciendo la lista completa como de salida, tales como:

{ productName = Awesomenes Game, productExcerpt = <b>Awesome game dude!</b>, imageID = 13, imageURL = HotWallpapers.me - 008.jpg }{ productName = RPG Strategy Game, productExcerpt = <i>Test product excerpt</i>, imageID = 14, imageURL = HotWallpapers.me - 014.jpg }

Lo que yo pensaba que podía hacer era:

@foreach(var item in ViewBag.Products)
{
    @item.productName
}

Como se puede ver, en la salida, productName = Awesomenes Juego. Sin embargo, obtengo el mensaje de error ‘objeto’ no contiene una definición para ‘productName’ cuando intento esto.

¿Cómo puedo salida de cada «campo», por así decir individualmente en mi bucle para que yo pueda aplicar la correcta etiquetas HTML y el estilo necesario para mi página?

Necesito para hacer una nueva Perspective para ello, y, a continuación, crear un modelo de visualización como se hace referencia aquí: ‘objeto’ no contiene una definición para ‘X’

O puedo hacer lo que estoy tratando aquí?

*****ACTUALIZACIÓN*****

En mi Controlador ahora tengo lo siguiente:

        var bundle = db.Bundle.Where(a => a.bundleInactiveDate > DateTime.Now);
        var products = from bundles in db.Bundle
                       join bProducts in db.BundleProducts on bundles.bundleId equals bProducts.bundleID
                       join product in db.Products on bProducts.productID equals product.productID
                       join images in db.Images on product.productID equals images.productID
                       where bundles.bundleInactiveDate > DateTime.Now
                       select new {
                           product.productName,
                           product.productExcerpt,
                           images.imageID,
                           images.imageURL
                       };
        var bundleContainer = new FullBundleModel();

        bundleContainer.bundleItems = bundle;

        return View(bundleContainer);

Tengo un modelo, FullBundleModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace JustBundleIt.Models
{
    public class FullBundleModel
    {
        public IQueryable<Bundles> bundleItems { get; set; }
        public IQueryable<Images> imageItems { get; set; }
    }
}

y mi punto de Vista ahora ha

@model IEnumerable<JustBundleIt.Models.FullBundleModel>

@foreach (var item in Model) 
{
<div class="hp_bundle">

    <h3>@Html.Display(item.bundleName)</h3>
    </div>
}       

Si puedo quitar IEnumerable a partir del modelo de referencia, el foreach errores que no hay ninguna definición de un enumerador.

En el @Html.Pantalla(artículo.bundleName) que los errores que el modelo no tiene ninguna definición para bundleName. Si intento

@foreach(var item in Model.bundleItems)

Me sale un error que bundleItems no está definido en el modelo.

Así que lo que no tengo conectada correctamente a utilizar el modelo combinado?

  • Primero: no se define su Modelo como IEnumerable. Sólo uso @model JustBundleIt.Models.FullBundleModel. Segundo: el cambio de su bucle for para @foreach(var item in Model.bundleItems) y su ayuda HTML para @Html.DisplayFor(modelItem => item.bundleName).
  • Gracias. Esta es la forma en que puedo decir que he estado en ella durante demasiado tiempo el día de hoy. Muy apreciado.
  • lol, no hay problema. Todos hemos estado allí. No ayuda que no es por lo general MUCHO más de una manera de hacer las cosas en nuestro mundo. Probablemente se podría hacer frente a este problema entre los más de 100 maneras diferentes y aún así terminar con el mismo resultado final.
InformationsquelleAutor SouthPlatte | 2012-09-18

2 Comentarios

  1. 0

    ¿Por qué no crear un nuevo modelo que contiene todos los datos que usted necesita?

    Ejemplo Uno:

    public class ContainerModel
    {
        public IQueryable<T> modelOne;
        public IQueryable<T> modelTwo;
    }

    Esto le permitirá acceder a cualquiera de sus consultas en la maquinilla de Afeitar:

    @model SomeNamespace.ContainerModel
    
    @foreach (var item in Model.modelOne)
    {
        //Do stuff
    }

    Yo personalmente evitar el uso de ViewBag a todos y guardar todo lo que necesito en estos modelos, porque NO es dinámica y las fuerzas de todo para ser inflexible. También creo que esto le da una estructura claramente definida/intención.

    Y sólo en aras de la claridad:

    public ViewResult Index()
    {
        var queryOne = from p in db.tableOne
                       select p;
    
        var queryTwo = from p in db.tableTwo
                       select p;
    
        var containerModel = new ContainerModel();
        containerModel.modelOne = queryOne;
        containerModel.modelTwo = queryTwo;
    
        return View(containerModel);
    }

    Ejemplo Dos:

    public class ContainerModel
    {
        [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] //Format: MM/dd/yyyy (Date)
        public Nullable<DateTime> startDate { get; set; }
        [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] //Format: MM/dd/yyyy (Date)
        public Nullable<DateTime> endDate { get; set; }
        public SelectList dropdown { get; set; }
        public IQueryable<T> modelOne { get; set; }
        public IQueryable<T> modelTwo { get; set; }
    }

    En este caso, usted ha almacenado 3 otros elementos en el modelo con sus 2 consultas. Usted puede utilizar el código Html ayudantes para crear una Lista Desplegable en la maquinilla de Afeitar:

    @Html.DropDownList("dropdown", Model.dropdown)

    Y usted puede utilizar el DisplayFor ayudante para mostrar las fechas de su viaje, como se define en el modelo con Anotaciones de Datos:

    @Html.DisplayFor(a => a.startDate)

    Esto es una ventaja de la OMI, ya que permite definir todos los datos que desee hacer uso de su Vista Y de cómo piensa el formato de los datos en un solo lugar. El Controlador contiene toda la lógica de negocio, el Modelo contiene todos los datos/formateo, y su Opinión es sólo cuestión con el contenido de tu página.

    • Así, un modelo que no hace nada, sino que contienen otros modelos, luego puedo acceder a los varios modelos dentro de la vista sin problema?
    • Yo no diría eso. El Modelo puede contener todo lo que usted desea. Puse todo lo que necesito en un particular punto de Vista en un Modelo. Voy a añadir un ejemplo en un momento.
    • Agregó segundo ejemplo con más de consultas.
    • Gracias. Aún teniendo algunos problemas. Yo podría actualizar con lo que he hecho para aclarar mi intento de su ejemplo.
  2. 2

    Necesito para hacer una nueva Perspective para ello, y, a continuación, crear un
    visualización de la plantilla como la que se hace referencia aquí…

    La respuesta de Darin que enlaza los estados del concepto importante: Los tipos anónimos no están destinados para su uso a través de la asamblea de los límites de y no está disponible para la maquinilla de Afeitar. Me gustaría añadir que rara vez es una buena idea para exponer anónimo objetos fuera de su contexto inmediato.

    La creación de un modelo de vista específicamente para ver el consumo es casi siempre el enfoque correcto. Ver los modelos pueden ser reutilizados a través de puntos de vista, si estás presentando datos similares.

    No es necesario crear un modelo de visualización, pero puede ser útil si desea reutilizar la lógica de presentación. Ayudantes HTML también puede llenar una función similar de proporcionar reutilizables lógica de presentación.

    Habiendo dicho todo esto, no es imposible pasar de un tipo anónimo a una vista, o a leer un tipo anónimo miembros. Un RouteValueDictionary puede tomar un tipo anónimo (incluso a través de asambleas) y leer sus propiedades. La reflexión que hace posible la lectura de los miembros, independientemente de la visibilidad. Si bien esto tiene sus usos, pasar datos a una Vista es no uno de ellos.

    Leer más:

Dejar respuesta

Please enter your comment!
Please enter your name here