ViewModel错误:未将对象引用设置为对象的实例

Wiz*_*986 1 c# asp.net asp.net-mvc nullreferenceexception

我不明白为什么我会收到这个错误,请你帮我找一下我做错了什么?

我想用这个ViewModel实现的是因为我有许多记录使用相同的CartId将其用作父项,并将booking.Item.ItemName用作子项.

你能否告诉我,我试图做的方式是否正确?

控制器:

public ActionResult MyBookings()
{

    var myBookingList = SystemDB.Carts.Where(s => s.Booking.Login == strLoginName).OrderByDescending(s => s.RecordId).Take(10);


    List<MyBookingsViewModel> result = new List<MyBookingsViewModel>();
    foreach (var item in myBookingList)
    {
        MyBookingsViewModel model = new MyBookingsViewModel();

        model.Carts.RecordId = item.RecordId;
        model.Carts.CartId = item.CartId;
        model.Carts.Booking.Item.ItemName = item.Booking.Item.ItemName;
        model.Carts.Booking.UserFullName = item.Booking.UserFullName;
        model.Carts.Booking.RequestDate = item.Booking.RequestDate;
        model.Carts.StatusCode.StatusCodeName = item.StatusCode.StatusCodeName;
        result.Add(model);
    }


    return View(result);
}
Run Code Online (Sandbox Code Playgroud)

模型:

public class MyBookingsViewModel
{
    public Cart Carts { get; set; }
    public List<Booking> Bookings { get; set; }
}

public class Cart
{
    [Key]
    public int RecordId { get; set; }
    public string CartId { get; set; }       
    public int Count { get; set; }



    [ForeignKey("Booking")]
    public int BookingId { get; set; }
    public virtual Booking Booking { get; set; }

    [ForeignKey("StatusCode")]
    public int Stage { get; set; }
    public virtual StatusCode StatusCode { get; set; }

    public Cart()
    {
        this.Booking = new List<Booking>();
    }
}

public class Booking
{
     [DisplayName("BookingId")]
    public int BookingId { get; set; }

    [ForeignKey("Item")]
    public int ItemId { get; set; }
    public virtual Item Item { get; set; }

    [DisplayName("Name")]
    public string UserFullName { get; set; }


    [DateStart]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yy hh:mm tt}", ApplyFormatInEditMode = true)]
    public DateTime StartDate { get; set; }

    [DateEnd(DateStartProperty = "StartDate")]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yy hh:mm tt}", ApplyFormatInEditMode = true)]
    public DateTime EndDate { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:d MMM yyyy}", ApplyFormatInEditMode = true)]
    public System.DateTime RequestDate { get; set; }

    [DisplayName("Login")]
    public string Login { get; set; }

    [DisplayName("NetworkID")]
    public string NetworkID { get; set; }

    [DisplayName("Comments")]
    public string Comments { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

视图:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Carts.RecordId)
        </td>
        <td>
            <a href="@Url.Action("ItemDetails", new {id=item.Carts.BookingId })" >
            @Html.DisplayFor(modelItem => item.Carts.CartId)
                </a>
            @foreach(var booking in item.Bookings)
   {
     <li>@booking.Item.ItemName</li>
   }
        </td>
</tr>
}
Run Code Online (Sandbox Code Playgroud)

eka*_*kad 7

看看你的模型类定义

public class MyBookingsViewModel
{
    public Cart Carts { get; set; }
    public List<Booking> Bookings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以及控制器代码中的以下行

foreach (var item in myBookingList)
{
    MyBookingsViewModel model = new MyBookingsViewModel();

    model.Carts.RecordId = item.RecordId;
    model.Carts.CartId = item.CartId;
    model.Carts.Booking.Item.ItemName = item.Booking.Item.ItemName;
    model.Carts.Booking.UserFullName = item.Booking.UserFullName;
    model.Carts.Booking.RequestDate = item.Booking.RequestDate;
    model.Carts.StatusCode.StatusCodeName = item.StatusCode.StatusCodeName;
    result.Add(model);
}
Run Code Online (Sandbox Code Playgroud)

你试图设置model.Carts.RecordIdwhile model.Carts为null.Carts在执行此操作之前,您需要初始化属性.初始化应该在构造函数中完成,以避免代码重复.将模型类定义更改为以下内容

public class MyBookingsViewModel
{
    public MyBookingsViewModel()
    {
        this.Carts = new Cart();
    }
    public Cart Carts { get; set; }
    public List<Booking> Bookings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

更新: 根据您对此行中错误的评论:

model.Carts.Booking.Item.ItemName = item.Booking.Item.ItemName;
Run Code Online (Sandbox Code Playgroud)

model.Carts.Booking设置值时,问题为null model.Carts.Booking.Item.这一行也有类似的问题:

model.Carts.StatusCode.StatusCodeName = item.StatusCode.StatusCodeName;
Run Code Online (Sandbox Code Playgroud)

model.Carts.StatusCode当你设置值时为null model.Carts.StatusCode.StatusCodeName,所以你需要Cart在构造函数中将类似的东西添加到类定义中,如下所示:

public class Cart()
{
    public Cart()
    {
        this.Booking = new Booking();
        this.StatusCode = new StatusCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

以及在Booking课堂定义中

public class Booking()
{
    public Booking()
    {
        this.Item = new Item();
    }
}
Run Code Online (Sandbox Code Playgroud)