【问题标题】:MVC View Model adviceMVC 视图模型建议
【发布时间】:2014-12-12 16:24:45
【问题描述】:

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

默认控制器和视图工作正常,但我对其进行了更改,以便用户可以选择主页>索引视图中每个主页旁边的“预订”按钮,其中列出了所有可用的。

然后在 Booking > Create 控制器中,我构建了一个 HomeBookingsViewModel,其中包含该 Home 的 Home ID、Number 和 Bookings 列表。

在 Booking > Create 视图中,我调用部分视图并传递 model.Bookings,它会显示在表格中。

然后我使用表单来获取新的预订。为此,我必须修改我的 HomeBookingViewModel(见下文)以包含 FromTo 日期,否则我无法在控制器中获取这些值。

{
    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>Create[HttpPost] 方法检测到错误(必须检查!)我无法构建 HomeBookingViewModel 以在返回中传回。

问题:我是不是让事情变得过于复杂,或者,如果这听起来合理,我如何从 Home>Create[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
}

【问题讨论】:

    标签: asp.net-mvc viewmodel


    【解决方案1】:

    考虑创建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);
    

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多