Передача данных из представления в контроллер и обратно в тот же вид ASP Net Core MVC

#ajax #asp.net-core-mvc

#ajax #asp.net-core-mvc

Вопрос:

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

 <form asp-action="Create">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="PatientId" class="control-label"></label>
            <select asp-for="PatientId" class="form-control" asp-items="ViewBag.PatientId"></select>
        </div>
        <div class="form-group">
            <label asp-for="DoctorId" class="control-label"></label>
            <select asp-for="DoctorId" id="iddoctor" class="form-control" asp-items="ViewBag.DoctorId" onchange="go()">
            </select>
        </div>
       <div class="form-group">
           <label asp-for="date" class="control-label"></label>
           <input asp-for="date" class="form-control" />
           <span asp-validation-for="date" class="text-danger"></span>
       </div>
       <div class="form-group">
    <label asp-for="date" class="control-label"></label>
    <select asp-for="date" class="form-control" asp-items="ViewBag.date"></select>
</div>
 

Я выбираю пациента, врача и дату из календаря и хочу отправить его контроллеру, который должен сгенерировать список доступных часов для размещения на той же странице в ViewBag.дата, чтобы я мог выбрать также час и завершить добавление посещения, нажав «добавить посещение»

Мой контроллер создает функцию

 public IActionResult Create()
    {
     ViewData["DoctorId"] = new SelectList(_context.Doctors, "DoctorId", "Surname" );
     ViewData["PatientId"] = new SelectList(_context.Patients, "PatientId", "Surname" );
     return View();
    }
 

Редактировать :
Решение в моем ответе ниже

Ответ №1:

Я выбираю пациента, врача и дату из календаря и хочу отправить его контроллеру, который должен сгенерировать список доступных часов для размещения на той же странице в ViewBag.дата, чтобы я мог выбрать также час и завершить добавление посещения, нажав «добавить посещение»

Чтобы выполнить требование, вы можете попытаться определить новое свойство для hour информации, как показано ниже.

 public class VisitViewModel
{
    public int PatientId { get; set; }
    public int DoctorId { get; set; }
    [DataType(DataType.Date)]
    public DateTime date { get; set; }
    public string hour { get; set; }
}
 

Обновить код представления для привязки hour поля

 @model VisitViewModel
@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<form asp-action="Create">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="PatientId" class="control-label"></label>
        <select asp-for="PatientId" class="form-control" asp-items="ViewBag.PatientId"></select>
    </div>
    <div class="form-group">
        <label asp-for="DoctorId" class="control-label"></label>
        <select asp-for="DoctorId" id="iddoctor" class="form-control" asp-items="ViewBag.DoctorId" onchange="go()">
        </select>
    </div>
    <div class="form-group">
        <label asp-for="date" class="control-label"></label>
        <input asp-for="date" class="form-control" />
        <span asp-validation-for="date" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="hour" class="control-label"></label>
        <select asp-for="hour" class="form-control" asp-items="ViewBag.date"></select>
    </div>
    <input type="submit" value="Create" />
</form>
 

В методе action сгенерируйте новую дату и время на основе выбранных дня и часа.

 public IActionResult Create(VisitViewModel visit)
{
    var date = visit.date.ToShortDateString();

    var newdate = Convert.ToDateTime(date   " "   visit.hour);

    //...

    //code logic

    //...
 

Результат теста

введите описание изображения здесь

Комментарии:

1. Я не знаю, правильно ли вы меня поняли, или, может быть, я не понял вашего ответа. Прежде чем я нажму кнопку «Создать», и мой визит будет добавлен в базу данных, я хочу, чтобы список часов «обновить» отображался после выбора правильного врача — я не знаю, какие часы доступны, прежде чем я не выберу своего врача.

2. I want "refresh" hours list in view after choosing a right doctor - I don't know what hours are available before I don't choose my doctor. Вы хотели бы реализовать каскадный выпадающий список доступных часов на основе выбранного врача и даты?

3. Да, точно 🙂

Ответ №2:

Хорошо, я нашел решение самостоятельно. Я заменил последний div в моем представлении на этот :

             <div class="form-group">
                <label asp-for="hour" class="control-label"></label>
                <select asp-for="hour" class="form-control" asp-items="ViewBag.hour"> 
                 </select>
            </div> 
 

Затем я добавил функцию «goes» к событию изменения в список врачей и календарь

  <select asp-for="DoctorId" id="iddoctor" class="form-control" onchange= "goes()" asp- 
 items="ViewBag.DoctorId">
 

В goes() функции есть код :

  $.ajax({
                  url: '@Url.Action("Updatedata", "Visits")',
                        dataType: "json",
                        data: { x, data: y} ,
                        success: function (data) {
                          var items = data;
                          var item = "";
                          var itemss
                          for (var i = 0; i < items.length; i  ) {
                              item = items[i];
                              item = item.replace("0001-01-01T", "").slice(0, -3);
                              itemss  = "<option value='"   item   "'>"   item   " 
                              </option>"
                              }
                             $('#hour').html(itemss);},});}};
 

где я отправляю выбранный идентификатор врача и выбранную дату в функцию «updatedata» в VisitsController, которая возвращает мне список доступных часов. Я надеюсь, что кто-то найдет это решение полезным.