asp.net-mvc如何在 MVC 中使用视图模型的编辑?

发布时间: 2016/10/5 11:45:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

新 MVC 和试图理解 Viewmodel !我明白如何使用创建和 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);
    }

解决方法 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; } )

赞助商