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)
看看你的模型类定义
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)