Как передать данные из viewmodel в? - PullRequest
3 голосов
/ 23 апреля 2019

Я новичок в MVC и пытаюсь понять модели представления.У меня есть Staff, Service, BookingSlot, Appointments и ApplicationUser сущностей.У меня есть следующая модель представления:

public class AppointmentBookingViewModel
{
    [Display (Name ="Select Staff")]
    public int StaffId { get; set; }
    public IEnumerable<Staff> Staffs { get; set; }

    [Display(Name = "Select Service")]
    public int ServiceId { get; set; }
    public IEnumerable<Service> Services { get; set; }

    [Display(Name = "Select Slot")]
    public int BookingSlotId { get; set; }
    public IEnumerable<BookingSlot> BookingSlots { get; set; }

}

Это контроллер:

public class AppointmentBookingController : Controller
{
    private readonly SalonContext _context;

    private AppointmentBookingViewModel _appointmentBookingViewModel = new AppointmentBookingViewModel();

    public AppointmentBookingController(SalonContext context)
    {
        _context = context;
        ConfigureViewModel(_appointmentBookingViewModel);
    }

    public void ConfigureViewModel(AppointmentBookingViewModel appointmentBookingViewModel)
    {
        appointmentBookingViewModel.Staffs = _context.Staffs;
        appointmentBookingViewModel.Services = _context.Services;
        appointmentBookingViewModel.BookingSlots = _context.BookingSlots;
    }

    // GET: AppointmentBooking
    public ActionResult Index()
    {
        return View(_appointmentBookingViewModel);
    }
}

У меня вопрос, как я могу создать форму в представлении и опубликовать данные в таблице встречследующее не работает.

@model HairStudio.Services.ViewModels.AppointmentBooking.AppointmentBookingViewModel
@{
    ViewData["Title"] = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div class="row">
    <div class="col-12">
        <form asp-action="Create">
            <div class="form-group">
                <label asp-for="ServiceId" class="control-label"></label>
                <select asp-for="ServiceId" class="form-control"></select> 
            </div>

            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

В модели вида нет ничего волшебного.Это просто класс.Идея состоит в том, что класс сущности (то есть вещь, которую вы сохраняете в базе данных через Entity Framework) должен касаться только потребностей базы данных.Представление может и часто имеет совершенно другой набор потребностей, поэтому вы создаете класс специально для этого: модель представления.Это просто базовый SRP (принцип единой ответственности): один класс не должен пытаться делать слишком много.

Тогда вам просто нужен способ соединить их.Другими словами, вам необходимо скопировать значения из сущности в модель представления и наоборот.Этот процесс называется картированием и может быть достигнут различными способами.Наиболее распространенным подходом является использование сторонней библиотеки, такой как AutoMapper.Тем не менее, вы также можете просто вручную сопоставить каждое значение или даже использовать что-то похожее на фабричный шаблон, где у вас есть другой класс, который содержит знания о том, как выполнить сопоставление, и может выплевывать сущность из модели представления и наоборот.

Теперь, на самом деле невозможно дать вам точное руководство, потому что у нас нет вашей сущности, но вы, похоже, хотите выбрать конкретные Staff, Service и BookingSlotи свяжите это с Appointment, который вы создаете.Это не критично, но для эффективности вы не должны носить с собой полный набор всех этих сущностей в вашей модели представления.Все, что вам нужно, это IEnumerable<SelectListItem>, который позволяет вам использовать гораздо более эффективные запросы:

Вместо свойства Staffs, например:

public IEnumerable<SelectListItem> StaffOptions { get; set; }

Тогда:

model.StaffOptions = await _context.Staffs.AsNoTracking()
    .Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() })
    .ToListAsync();

На ваш взгляд:

<select asp-for="StaffId" asp-items="@Model.StaffOptions" class="form-control"></select> 
0 голосов
/ 23 апреля 2019

Вы уже направили свою форму в действие с именем "Создать" с атрибутом asp-action, но в вашем контроллере такого действия нет. Отправка формы отправляет HTTP-запрос POST, который должен обрабатываться вашим контроллером. Поэтому добавьте метод Create() в ваш AppointmentBookingController:

// POST: Create
public IActionResult Create(AppointmentBookingViewModel appointmentViewModel)
{
    if (!ModelState.IsValid)
    {
        // Server side validation of form has failed.
        // Return to the calling view and inform the user about the errors.
        return View(appointmentViewModel, "Index");
    }

    return View(appointmentViewModel, "<NAME_OF_YOUR_CREATED_APPOINTMENT_VIEW>");
}

Рассмотрите возможность перенаправления после успешного принятия HTTP-запроса POST в соответствии с шаблоном проектирования. Post / Redirect / Get .

Также обратите внимание на эту часть документации ASP.NET Core по работе с формами. Я уверен, что вы найдете там что-то ценное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...