#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, которая возвращает мне список доступных часов. Я надеюсь, что кто-то найдет это решение полезным.