我正在开发我的第一个MVC应用程序并对ViewModels有疑问。
我的应用有一个Home模型:
{
public int ID { get; set;}
public int Number {..} << This is not the same as the ID and is displayed on all pages for a Home
public string Name {..}
..
}
和预订模式:
{
public int ID {..}
[ForeignKey]
public int HomeID {..}
public virtual Home Home {..}
...
}
默认控制器和视图工作正常,但我更改了它,以便用户可以选择“预订”。主页&gt;索引视图中每个主页旁边的按钮列出了所有可用的内容。
然后在预订&gt;创建控制器我构建了一个HomeBookingsViewModel
,其中包含该主页的主页ID,编号和预订列表。
在预订中&gt;创建视图我调用部分视图并传递显示在表格中的model.Bookings
。
然后我使用表格来获取新的预订。要做到这一点,我必须修改我的HomeBookingViewModel
(见下文)以包含 From 和 To 日期,否则我无法在控制器中获取这些值
{
public int HomeID { get; set; }
public int HomeNo { get; set; }
[Required]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yy}", ApplyFormatInEditMode = true)]
[Display(Name = "Start date")]
public DateTime FromDate { get; set; }
[Required]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yy}", ApplyFormatInEditMode = true)]
[Display(Name = "End date")]
public DateTime ToDate { get; set; }
public List<Booking> Bookings { get; set; }
}
我现在遇到的问题是,如果Booking&gt; Create [HttpPost]方法检测到错误(必须检查!)我无法构建HomeBookingViewModel
以在返回时传回。
问题:我是否过于复杂,或者,如果这听起来合理,我如何从主页&gt;创建[HttpPost]控制器返回错误的表单,如下所示:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "HomeID,FromDate,ToDate,BookedBy")] Booking booking)
{
if (ModelState.IsValid)
{
if ( (booking.FromDate > booking.ToDate) || (booking.FromDate < DateTime.Today.Date) || (booking.ToDate < DateTime.Today.Date))
{
return View(booking);
}
db.Bookings.Add(booking);
db.SaveChanges();
return RedirectToAction("Create", new { id = booking.StoreID } );
}
return View(booking); << Create view is expecting MyApp.Models.BookingViewModel but this is sending just a Booking
}
答案 0 :(得分:0)
考虑创建BookingViewModel
,它将存放在您的Booking
已创建对象中。
BookingViewModel
也会有Error
(字符串成员会浏览),其中包含显而易见的内容,您可以检查返回的Booking
对象是否有效。
示例:强>
class BookingViewModel
{
public Booking Booking { get; set; }
public string Error { get; set; }
// More members here
}
如果你已经上过这门课程,那么下面的课程将会为你提供更多的服务。
var bookingViewModel = new BookingViewModel
{
Booking = booking,
IsValid = ModelState.IsValid
}
return View(bookingViewModel);