我是MVC新手并试图了解ViewModels。我理解如何使用Create和ViewModel,但我不确定如何使用视图模型进行编辑?
我的虚拟机:
public class BookingViewModel
{
[Display (Name = "Select Patient")]
public Guid PatientId { get; set; }
public IEnumerable<SelectListItem> PatientList { get; set; }
[Display(Name = "Select Practice")]
public Guid PracticeId { get; set; }
public IEnumerable<SelectListItem> PracticeList { get; set; }
[Display(Name = "Select Optician")]
public Guid OpticianId { get; set; }
public IEnumerable<SelectListItem> OpticiansList { get; set; }
public Optician Optician { get; set; }
[Display(Name = "Select Date")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime Date { get; set; }
[Display(Name = "Select Time")]
public Guid TimeId { get; set; }
public IEnumerable<SelectListItem> TimeList { get; set; }
}
我的控制器:
public ActionResult Create()
{
// Creates a new booking
BookingViewModel bookingViewModel = new BookingViewModel();
// Initilises Select List
ConfigureCreateViewModel(bookingViewModel);
return View(bookingViewModel);
}
// Initilises Select List
public void ConfigureCreateViewModel(BookingViewModel bookingViewModel)
{
// Displays Opticians Name - Needs changed to full name
bookingViewModel.OpticiansList = db.Opticians.Select(o => new SelectListItem()
{
Value = o.OpticianId.ToString(),
Text = o.User.FirstName
});
// Displays Patients name - needs changed to full name DOB
bookingViewModel.PatientList = db.Patients.Select(p => new SelectListItem()
{
Value = p.PatientId.ToString(),
Text = p.User.FirstName
});
// Displays Practice Name
bookingViewModel.PracticeList = db.Practices.Select(p => new SelectListItem()
{
Value = p.PracticeId.ToString(),
Text = p.PracticeName
});
// Displays Appointment Times
bookingViewModel.TimeList = db.Times.Select(t => new SelectListItem()
{
Value = t.TimeId.ToString(),
Text = t.AppointmentTime
});
}
// Allows Admin to create booking for patient
// POST: Bookings1/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(BookingViewModel bookingViewModel)
{
// to ensure date is in the future
if (ModelState.IsValidField("Date") && DateTime.Now > bookingViewModel.Date)
{
ModelState.AddModelError("Date", "Please enter a date in the future");
}
// if model state is not valid
if (!ModelState.IsValid)
{
// Initilises Select lists
ConfigureCreateViewModel(bookingViewModel);
return View(bookingViewModel); // returns user to booking page
}
else // if model state is Valid
{
Booking booking = new Booking();
// Sets isAvail to false
booking.isAvail = false;
booking.PracticeId = bookingViewModel.PracticeId;
booking.Optician = bookingViewModel.Optician;
booking.PatientId = bookingViewModel.PatientId;
booking.Date = bookingViewModel.Date;
booking.TimeId = bookingViewModel.TimeId;
// Generates a new booking Id
booking.BookingId = Guid.NewGuid();
// Adds booking to database
db.Bookings.Add(booking);
// Saves changes to Database
db.SaveChanges();
// Redirects User to Booking Index
return RedirectToAction("Index");
}
}
我真的不确定如何编辑视图模型,任何建议都将非常感谢
public ActionResult Edit(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Booking booking = db.Bookings.Find(id);
if (booking == null)
{
return HttpNotFound();
}
BookingViewModel bookingViewModel = new BookingViewModel()
{
Date = booking.Date,
OpticianId = booking.OpticianId,
PatientId = booking.PatientId,
PracticeId = booking.PracticeId,
TimeId = booking.TimeId
};
return View(booking, bookingViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Booking booking)
{
if (ModelState.IsValid)
{
db.Entry(booking).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(booking);
}
答案 0 :(得分:2)
Controller.View方法没有超载接受2个模型/对象。
你需要Edit()
GET方法
public ActionResult Edit(Guid? id)
{
....
BookingViewModel bookingViewModel = new BookingViewModel()
{
....
}
// Call the ConfigureCreateViewModel() method so that you SelectList's are populated
// as you have done in the Create() method (ConfigureViewModel might be a better name?)
ConfigureCreateViewModel(bookingViewModel);
return View(bookingViewModel); // adjust this
}
并且POST方法需要
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(BookingViewModel model)
{
if (!ModelState.IsValid)
{
ConfigureCreateViewModel(model)
return View(model);
}
// Get your data model and update its properties based on the view model
Booking booking = db.Bookings.Find(id);
booking.PracticeId = bookingViewModel.PracticeId;
booking.OpticianId = bookingViewModel.OpticianId;
.... // etc
db.Entry(booking).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
您的观点应该有@model BookingViewModel
附注:您的视图模型应不包含属性public Optician Optician { get; set; }
(您绑定到属性public Guid OpticianId { get; set; }
)