Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 传递的模型项与预期的IEnumerable不匹配_C#_Asp.net_Asp.net Mvc_Database_Entity Framework - Fatal编程技术网

C# 传递的模型项与预期的IEnumerable不匹配

C# 传递的模型项与预期的IEnumerable不匹配,c#,asp.net,asp.net-mvc,database,entity-framework,C#,Asp.net,Asp.net Mvc,Database,Entity Framework,我正在为学校建一个项目。我就快到了,但有一个错误我无法纠正。 我正在asp.net网站上预订自行车。 错误是我将一个列表传递到保留的索引页,它需要一个IEnumerable。 我已经试着制作一个预期的列表,但这也给出了一个错误 我已经看到这个问题的其他修复方法,但我无法让它工作 这是我最初的索引方法 // GET: Reservations public ActionResult Index() { var reservations = db.Reserv

我正在为学校建一个项目。我就快到了,但有一个错误我无法纠正。 我正在asp.net网站上预订自行车。 错误是我将一个列表传递到保留的索引页,它需要一个IEnumerable。 我已经试着制作一个预期的列表,但这也给出了一个错误

我已经看到这个问题的其他修复方法,但我无法让它工作

这是我最初的索引方法

    // GET: Reservations
    public ActionResult Index()
    {
        var reservations = db.Reservations.Include(r => r.Bike).Include(r => r.Customer).Include(r => r.DropoffStore).Include(r => r.PickupStore);
        return View(reservations.ToList());
    }
这是我从其他人那里得到的新控制器索引方法,但我不知道为什么我不工作:

    // GET: Reservations
    public ActionResult Index()
    {
        var reservations = db.Reservations.Include(r => r.Bike).Include(r => r.Customer).Include(r => r.DropoffStore).Include(r => r.PickupStore);

        IEnumerable<ReservationViewModel> reservationViewModels = new List<ReservationViewModel>();

        foreach (var reservation in reservations)
        {
            var reservationViewModel = new ReservationViewModel
            {

            };

            reservationViewModels.ToList().Add(reservationViewModel);

        }

        return View(reservationViewModels);
    }
我的整个预订视图模型:

using ASP.NET_Framwork_for_real_bitch.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ASP.NET_Framwork_for_real_bitch.ViewModels
{
    public class ReservationViewModel
    {
        private BikeShoppaModel db = new BikeShoppaModel();
        public Reservation Reservation { get; set; }
        public SelectList DropoffStore_Id { get; private set; }
        public SelectList PickupStore_Id { get; private set; }
        public SelectList Bikes { get; private set; }
        public SelectList CustomerGender { get; set; }
        public int TotalDays { get; set; }
        public double TotalPrice { get; set; }
        public ReservationViewModel()
        {
            DropoffStore_Id = new SelectList(db.Stores, "Id", "StoreName");
            PickupStore_Id = new SelectList(db.Stores, "Id", "StoreName");
            Bikes = new SelectList(db.Bikes, "Id", "Brand");
            CustomerGender = new SelectList(db.Customers, "Id", "Gender");
        }
        public ReservationViewModel(int id) : this()
        {
            Reservation = db.Reservations.Find(id);
            TotalDays = (Reservation.EndDate.Date - Reservation.StartDate.Date).Days + 1;
        }

        public void Save()
        {
            if(Reservation.Id > 0)
            {
                db.Entry(Reservation).State = EntityState.Modified;
            }
            else
            {
                db.Reservations.Add(Reservation);
            }



            db.SaveChanges();
        }   
    }
}
我的预订模式:

public class Reservation
    {
        public int Id { get; set; }

        [ForeignKey("Customer")]
        [Display(Name = "Customer")]
        public int Customer_Id { get; set; }
        public virtual Customer Customer { get; set; }
        [ForeignKey("Bike")]
        public int Bike_Id { get; set; }
        public Bike Bike { get; set; }


        [DataType(DataType.Date)]
        [Column(TypeName = "Date")]
        [Display(Name = "Start date")]
        public DateTime StartDate { get; set; }

        [DataType(DataType.Date)]
        [Column(TypeName = "Date")]
        [Display(Name = "End date")]
        public DateTime EndDate { get; set; }

        [ForeignKey("PickupStore")]
        [Display(Name = "Pickup store")]
        public int PickupStore_Id { get; set; }
        public Store PickupStore { get; set; }

        [ForeignKey("DropoffStore")]
        [Display(Name = "Dropoff store")]
        public int DropoffStore_Id { get; set; }
        public Store DropoffStore { get; set; }
    }

在控制器索引方法中返回保留列表。您的视图需要一个IEnumerable的ReservationViewModels。因此,您的控制器生成苹果,但您的视图需要桔子。 因此,你必须把苹果变成橘子来实现这一目标——作为一名软件开发人员,这是实现这一目标的几个优势之一:-) 试着这样做:

var reservations = db.Reservations.Include(r => r.Bike).Include(r => r.Customer).Include(r => r.DropoffStore).Include(r => r.PickupStore);

IEnumerable<ReservationViewModel> reservationViewModels = new List<ReservationViewModel>();

foreach (var reservation in reservations) 
{
    var reservationViewModel = new ReservationViewModel 
    {
        OneProperty = reservation.AnotherProperty
        //... other properties you need to convert ...
    }

    reservationViewModels.Add(reservationViewModel);
}

return View(reservationViewModels);
var reservations=db.reservations.Include(r=>r.Bike)。Include(r=>r.Customer)。Include(r=>r.DropoffStore)。Include(r=>r.PickupStore);
IEnumerable reservationViewModels=新列表();
foreach(保留中的var保留)
{
var reservationViewModel=新的reservationViewModel
{
OneProperty=reservation.AnotherProperty
//…需要转换的其他属性。。。
}
添加(reservationViewModel);
}
返回视图(reservationViewModels);

因此,您必须迭代您的苹果(保留类型的对象),并为每个苹果生成一个橙色(保留类型的对象ViewModel)。最后,您将这组橙子(IEnuerable of ReservationViewModel=传递给您的视图和您的完成。

请将控制器索引操作方法替换为以下方法,并发表您的评论:

// GET: Reservations
public ActionResult Index()
{
    var reservations = db.Reservations.Include(r => r.Bike).Include(r => r.Customer).Include(r => r.DropoffStore).Include(r => r.PickupStore);

    var reservationViewModels = new List<ReservationViewModel>();

    foreach (var reservation in reservations)
    {
        var reservationViewModel = new ReservationViewModel
        {

        };

        reservationViewModels.Add(reservationViewModel);
    }
    /* 
      // In short you can populate your viewmodels and return as below:
      return (reservations.Select(r => new ReservationViewModel{
      }).AsEnumerable());
    */

    return View(reservationViewModels.AsEnumerable());
}
//获取:预订
公共行动结果索引()
{
var reservations=db.reservations.Include(r=>r.Bike).Include(r=>r.Customer).Include(r=>r.DropoffStore).Include(r=>r.PickupStore);
var reservationViewModels=新列表();
foreach(保留中的var保留)
{
var reservationViewModel=新的reservationViewModel
{
};
添加(reservationViewModel);
}
/* 
//简而言之,您可以按如下方式填充viewmodels并返回:
return(reservations.Select(r=>newreservationviewmodel{
}).AsEnumerable());
*/
返回视图(reservationViewModels.AsEnumerable());
}

附带说明:您基本上混淆了实体模型和视图模型。它需要大量的清理和/或重构。

您需要将模型中的
Reservation
转换为视图模型中的
ReservationViewModel
。您可以使用Automapper或extension方法来实现这一点。您能澄清一下吗?我对
索引中的asp.net非常陌生ode>发送到
Reservation
实体的视图集合的操作,但在视图中引用了一个集合
ReservationViewModel
。因此两个对象不同。您有两种解决方案:1-在操作中将
Reservation
的集合转换为
ReservationViewModel
的集合,并将其发送到视图。2-在视图中直接使用
Reservation
实体。我建议使用第一种。它在Stackoverflow(以及其他地方)上被证明是一种很好的样式,但这在这里太过分了,无法响应注释和帮助。reservationViewModels.Add(reservationViewModel);给出了一个错误,它不包含add的定义。作为属性,我需要添加模型中的每个属性吗?检查拼写错误,列表有一个add方法(是否键入小写?)。只有那些您希望在视图中使用的属性。其他属性将保留其默认值(如0表示int或null表示字符串)。
var reservations = db.Reservations.Include(r => r.Bike).Include(r => r.Customer).Include(r => r.DropoffStore).Include(r => r.PickupStore);

IEnumerable<ReservationViewModel> reservationViewModels = new List<ReservationViewModel>();

foreach (var reservation in reservations) 
{
    var reservationViewModel = new ReservationViewModel 
    {
        OneProperty = reservation.AnotherProperty
        //... other properties you need to convert ...
    }

    reservationViewModels.Add(reservationViewModel);
}

return View(reservationViewModels);
// GET: Reservations
public ActionResult Index()
{
    var reservations = db.Reservations.Include(r => r.Bike).Include(r => r.Customer).Include(r => r.DropoffStore).Include(r => r.PickupStore);

    var reservationViewModels = new List<ReservationViewModel>();

    foreach (var reservation in reservations)
    {
        var reservationViewModel = new ReservationViewModel
        {

        };

        reservationViewModels.Add(reservationViewModel);
    }
    /* 
      // In short you can populate your viewmodels and return as below:
      return (reservations.Select(r => new ReservationViewModel{
      }).AsEnumerable());
    */

    return View(reservationViewModels.AsEnumerable());
}