ASP.Net MVC 3, Using ViewModel, error that ViewModel is not IEnumerable
OK, after searching and searching here, Google and other programming sites, it's time for me to ask my first question.

I have a view, Index.cshtml, that I need two Models in, so I created a ViewModel, ImageViewModel.cs, the two children models, ImageModel.cs and ProductModel.cs and have a controller, ImageController.cs.

For the life of me I cannot get the IEnumerable to work, I should be getting a set of data, one may have one item (product) and the other will have many (images).  The images are tied to the productID.

After playing with it, I am now to a point where in the view, @Html.DisplayFor(modelItem => item.imageTitle) throws an error that imageTitle does not exist.

If I revert any of the numerous IEnumerable items scattered throughout, I continue to the get ImageViewModel being passed in is not IEnumerable and the view expects it to be.

For what it is, here is the complete code listings:

Index.cshtml

    @model IEnumerable<JustAdminIt.Areas.JBI.ViewModels.ImageViewModel>
           
    @{
    ViewBag.Title = "Index";
    }

    <h2>Index</h2>

    <p>
    @Html.ActionLink("Create New", "Create")
    </p>
    <table>
    <tr>
        <th>
            Image Title
        </th>
        <th>
            Image Excerpt
        </th>
        <th>
            Image Description
        </th>
        <th>
            Image 
        </th>
        <th>
           Product ID
        </th>
        <th></th>
    </tr>
    @foreach (var item in Model) {

    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Image.imageTitle)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Image.imageExcerpt)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Image.imageDescription)
        </td>
        <td>
            <img src="@Url.Content("~/Content/images/product/")@Html.DisplayFor(modelItem => item.Image.imageURL)" alt="Product Image" width="150" />
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Product.productID)
        </td>

        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.Image.imageID }) |
            @Html.ActionLink("Details", "Details", new { id = item.Image.imageID }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.Image.imageID })
        </td>
    </tr>
    }

    </table>

ProductModel.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel;
    using System.Web.Mvc;

    namespace JustAdminIt.Areas.JBI.Models
    {
    public class Product
    {
        [Key]
        public int productID { get; set; }

        [Required]
        [DisplayName("Product Name")]
        public string productName { get; set; }
        
        [Required]
        [AllowHtml]
        [DisplayName("Product Excerpt")]
        public string productExcerpt { get; set; }

        [Required]
        [AllowHtml]
        [DisplayName("Product Description")]
        public string productDescription { get; set; }
        
        [DisplayName("Mark As Active")]
        public bool productActive { get; set; }

        [DisplayName("Product Add Date")]
        public DateTime? productAddDate { get; set; }

        [DisplayName("Product Inactive Date")]
        public DateTime? productInactiveDate { get; set; }

    }
    }

ImageModel.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel;
    using System.Web.Mvc;

    namespace JustAdminIt.Areas.JBI.Models
    {
    public class Image
    {
        [Key]
        public int imageID { get; set; }

        [Required]
        public string imageTitle { get; set; }

        [AllowHtml]
        public string imageExcerpt { get; set; }

        [AllowHtml]
        public string imageDescription { get; set; }

        [AllowHtml]
        public string imageURL { get; set; }

        [Required]
        public int productID { get; set; }
    }
    }

ImageController.cs

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using JustAdminIt.Areas.JBI.Models;
    using JustAdminIt.Areas.JBI.ViewModels;
    using JustAdminIt.Areas.JBI.DAL;
    using System.IO;

    namespace JustAdminIt.Areas.JBI.Controllers
    { 
    public class ImageController : Controller
    {
        private ImageContext db = new ImageContext();
        private ProductContext pb = new ProductContext();

        //
        // GET: /JBI/Image/

        public ViewResult Index()
        {
            //attempt new things
            int id = 1;
            IEnumerable<Image> image = db.Image.TakeWhile(x => x.productID == id);
            IEnumerable<Product> product = pb.Product.TakeWhile(x => x.productID == id);

            ImageViewModel piViewModel = new ImageViewModel(image, product);
            return View(piViewModel);
            //return View(db.Image.ToList());
        }

        //
        // GET: /JBI/Image/Details/5

        public ViewResult Details(int id)
        {
            Image image = db.Image.Find(id);
            return View(image);
        }

        //
        // GET: /JBI/Image/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /JBI/Image/Create
        //this simply populates the DB values, but does not handle the file upload

        [HttpPost]
        public ActionResult Create(Image image)
        {
            if (ModelState.IsValid)
            {
                db.Image.Add(image);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            return View(image);
        }

        [HttpPost]
        public ActionResult UploadFile(HttpPostedFileBase Filedata)
        {
            // Verify that the user selected a file
            if (Filedata != null && Filedata.ContentLength > 0)
            {
                // extract only the fielname
                var fileName = Path.GetFileName(Filedata.FileName);
                // store the file inside ~/App_Data/uploads folder
                var path = Path.Combine(Server.MapPath("~/Content/images/product/"), fileName);
                Filedata.SaveAs(path);
            }
            // redirect back to the index action to show the form once again
            return RedirectToAction("Index");
        }
        
        //
        // GET: /JBI/Image/Edit/5
 
        public ActionResult Edit(int id)
        {
            Image image = db.Image.Find(id);
            return View(image);
        }

        //
        // POST: /JBI/Image/Edit/5

        [HttpPost]
        public ActionResult Edit(Image image)
        {
            if (ModelState.IsValid)
            {
                db.Entry(image).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(image);
        }

        //
        // GET: /JBI/Image/Delete/5
 
        public ActionResult Delete(int id)
        {
            Image image = db.Image.Find(id);
            return View(image);
        }

        //
        // POST: /JBI/Image/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            Image image = db.Image.Find(id);
            db.Image.Remove(image);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
    }
ASP.Net MVC 3, Using ViewModel, error that ViewModel is not IEnumerable
===

OK, after searching and searching here, Google and other programming sites, it's time for me to ask my first question.

I have a view, Index.cshtml, that I need two Models in, so I created a ViewModel, ImageViewModel.cs, the two children models, ImageModel.cs and ProductModel.cs and have a controller, ImageController.cs.

For the life of me I cannot get the IEnumerable to work, I should be getting a set of data, one may have one item (product) and the other will have many (images).  The images are tied to the productID.

After playing with it, I am now to a point where in the view, @Html.DisplayFor(modelItem => item.imageTitle) throws an error that imageTitle does not exist.

If I revert any of the numerous IEnumerable items scattered throughout, I continue to the get ImageViewModel being passed in is not IEnumerable and the view expects it to be.

For what it is, here is the complete code listings:

Index.cshtml

    @model IEnumerable<JustAdminIt.Areas.JBI.ViewModels.ImageViewModel>
           
    @{
    ViewBag.Title = "Index";
    }

    <h2>Index</h2>

    <p>
    @Html.ActionLink("Create New", "Create")
    </p>
    <table>
    <tr>
        <th>
            Image Title
        </th>
        <th>
            Image Excerpt
        </th>
        <th>
            Image Description
        </th>
        <th>
            Image 
        </th>
        <th>
           Product ID
        </th>
        <th></th>
    </tr>
    @foreach (var item in Model) {

    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Image.imageTitle)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Image.imageExcerpt)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Image.imageDescription)
        </td>
        <td>
            <img src="@Url.Content("~/Content/images/product/")@Html.DisplayFor(modelItem => item.Image.imageURL)" alt="Product Image" width="150" />
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Product.productID)
        </td>

        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.Image.imageID }) |
            @Html.ActionLink("Details", "Details", new { id = item.Image.imageID }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.Image.imageID })
        </td>
    </tr>
    }

    </table>

ProductModel.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel;
    using System.Web.Mvc;

    namespace JustAdminIt.Areas.JBI.Models
    {
    public class Product
    {
        [Key]
        public int productID { get; set; }

        [Required]
        [DisplayName("Product Name")]
        public string productName { get; set; }
        
        [Required]
        [AllowHtml]
        [DisplayName("Product Excerpt")]
        public string productExcerpt { get; set; }

        [Required]
        [AllowHtml]
        [DisplayName("Product Description")]
        public string productDescription { get; set; }
        
        [DisplayName("Mark As Active")]
        public bool productActive { get; set; }

        [DisplayName("Product Add Date")]
        public DateTime? productAddDate { get; set; }

        [DisplayName("Product Inactive Date")]
        public DateTime? productInactiveDate { get; set; }

    }
    }

ImageModel.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel;
    using System.Web.Mvc;

    namespace JustAdminIt.Areas.JBI.Models
    {
    public class Image
    {
        [Key]
        public int imageID { get; set; }

        [Required]
        public string imageTitle { get; set; }

        [AllowHtml]
        public string imageExcerpt { get; set; }

        [AllowHtml]
        public string imageDescription { get; set; }

        [AllowHtml]
        public string imageURL { get; set; }

        [Required]
        public int productID { get; set; }
    }
    }

ImageController.cs

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using JustAdminIt.Areas.JBI.Models;
    using JustAdminIt.Areas.JBI.ViewModels;
    using JustAdminIt.Areas.JBI.DAL;
    using System.IO;

    namespace JustAdminIt.Areas.JBI.Controllers
    { 
    public class ImageController : Controller
    {
        private ImageContext db = new ImageContext();
        private ProductContext pb = new ProductContext();

        //
        // GET: /JBI/Image/

        public ViewResult Index()
        {
            //attempt new things
            int id = 1;
            IEnumerable<Image> image = db.Image.TakeWhile(x => x.productID == id);
            IEnumerable<Product> product = pb.Product.TakeWhile(x => x.productID == id);

            ImageViewModel piViewModel = new ImageViewModel(image, product);
            return View(piViewModel);
            //return View(db.Image.ToList());
        }

        //
        // GET: /JBI/Image/Details/5

        public ViewResult Details(int id)
        {
            Image image = db.Image.Find(id);
            return View(image);
        }

        //
        // GET: /JBI/Image/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /JBI/Image/Create
        //this simply populates the DB values, but does not handle the file upload

        [HttpPost]
        public ActionResult Create(Image image)
        {
            if (ModelState.IsValid)
            {
                db.Image.Add(image);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            return View(image);
        }

        [HttpPost]
        public ActionResult UploadFile(HttpPostedFileBase Filedata)
        {
            // Verify that the user selected a file
            if (Filedata != null && Filedata.ContentLength > 0)
            {
                // extract only the fielname
                var fileName = Path.GetFileName(Filedata.FileName);
                // store the file inside ~/App_Data/uploads folder
                var path = Path.Combine(Server.MapPath("~/Content/images/product/"), fileName);
                Filedata.SaveAs(path);
            }
            // redirect back to the index action to show the form once again
            return RedirectToAction("Index");
        }
        
        //
        // GET: /JBI/Image/Edit/5
 
        public ActionResult Edit(int id)
        {
            Image image = db.Image.Find(id);
            return View(image);
        }

        //
        // POST: /JBI/Image/Edit/5

        [HttpPost]
        public ActionResult Edit(Image image)
        {
            if (ModelState.IsValid)
            {
                db.Entry(image).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(image);
        }

        //
        // GET: /JBI/Image/Delete/5
 
        public ActionResult Delete(int id)
        {
            Image image = db.Image.Find(id);
            return View(image);
        }

        //
        // POST: /JBI/Image/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            Image image = db.Image.Find(id);
            db.Image.Remove(image);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
    }