MVC View Model建议

时间:2014-12-12 16:24:46

标签: asp.net-mvc viewmodel

我正在开发我的第一个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
}

1 个答案:

答案 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);