【问题标题】:How to Edit using a ViewModel in MVC?如何在 MVC 中使用 ViewModel 进行编辑?
【发布时间】:2015-09-04 14:04:13
【问题描述】:

我是 MVC 的新手,正在尝试了解 ViewModel。我了解如何使用 Create 和 ViewModel,但不确定如何使用 View Model 进行编辑?

我的虚拟机:

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

【问题讨论】:

  • 你从目前的工作中得到了什么结果?
  • @tcrite GET 编辑返回视图中存在无效的争论错误

标签: c# asp.net-mvc visual-studio mvvm


【解决方案1】:

没有接受 2 个模型/对象的 Controller.View 方法的重载。

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

【讨论】:

  • 再次感谢斯蒂芬。我以为您必须将 Id 传递给 POST 方法。我开始了解视图模型。感谢您的所有帮助!
  • 还应该补充一点 BookingViewModel 应该真正包含一个属性 pubic Guid? ID { get; set; } ,您在 GET 方法 (ID = booking.ID) 和 POST 方法中设置它应该是 Booking booking = db.Bookings.Find(model.ID); 因为你有一个方法中名为ID的参数,其自动绑定(例如您不需要为ID属性隐藏输入)
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多