2014-12-12 7 views
0

Я разрабатываю свое первое приложение MVC и задаю вопрос о ViewModels.MVC View Model advice

Мое приложение имеет Главную модель:

{ 
    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 {..} 
    ... 
} 

контроллеры и представления по умолчанию работали хорошо, но я изменил его так, что пользователь может выбрать ' Кнопка «Забронировать» рядом с каждым «Домой» на странице «Главная»> «Индекс», в котором перечислены все доступные.

Затем в Резервировании> Создать контроллер Я построю HomeBookingsViewModel, который содержит ИД дома, Номер, а затем Список Заказы для этого дома.

В режиме бронирования> Создать вид Я вызываю частичный вид и передаю model.Bookings, которые отображаются в таблице.

Затем я пользуюсь формой, чтобы получить новый заказ. Для этого мне пришлось изменить мой HomeBookingViewModel (см. Ниже), чтобы включить От и До дат, иначе у меня не было возможности получить эти значения в контроллере.

{ 
    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; } 

} 

Проблема теперь у меня есть, если бронирование> Создать [HttpPost] метод обнаруживает ошибку (должны проверить!) Я не могу построить HomeBookingViewModel передать обратно в ответ.

Вопрос: Могу ли я чрезмерно усложнять или, если это звучит разумно, как я возвращаюсь к форме с ошибками из дома> Создать [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

Рассмотрим создавая BookingViewModel, который населит ваш созданный объект Booking.

BookingViewModel также будет иметь Error (член строки будет заниматься серфингом), который будет содержать очевидное, и вы можете проверить, действительно ли возвращенный объект возвращается, или нет.

Пример:

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