NetCore MVC + JavaScripts - Szukam najlepszej drogi do dynamicznego pobierania danych po wybraniu elementu w <select>

0

Witam, mam scenariusz do rozwiązania:
Wybieram salę którą chcę zarezerwować w elemencie <select> i do tej pory zmiana wybranego elementu wywoływała metodę POST. Cała strona wczytywała się nowo. Chcę to nieco usprawnić i funkcją OnChange() pobrać aktualnie wybrany element w <select> i w jakiś sposób z poziomu **JavaScript **dowiedzieć się z metody ReservationService.CheckAvailableHours() które godziny na tą salę są jeszcze dostępne.

Który sposób jest według Was najlepszy?

  1. Wstrzyknąć do widoku mój ReservationService ?
  2. Stworzyć API na potrzeby wyciągania danych i wywoływać je z poziomu JavaScript?
  3. jakieś inne sugestie?

Jeżeli chodzi o punkt 1 to: Martwię się o widoczność danych logowania do bazy danych. Bo jeżeli skrypt jest po stronie klienta i jest tam wstrzyknięty serwis łączący się z baza danych to gdzieś ten **ConnectionString **jest ulokowany
Punkt drugi wydaje się najwłaściwszy, aczkolwiek dziwna alternatywa, bo przecież nie chcę, aby ktoś z zewnątrz miał dostęp do tego API

1

Numer 2. Znaczy to nie tak, że musisz mieć API, wystarczy jedna akcja, która będzie zwracać odpowiedniego JSON-a dla potrzeb twojego skryptu JS.

Możesz zrobić rozwiązanie w stylu anty-CSRF - generowany widok zawiera jednorazowy token który skrypt z tej strony będzie musiał odesłać, aby się uwierzytelnić. Jeżeli ktoś "z zewnątrz" spróbuje, to bez pobrania widoku wcześniej nie wykona żądania.

0

@Ktos: A mogę wywołać po prostu akcję kontrolera a nie API? Przeglądam sobie google i testuję. Mozesz doradzić, dlaczego _logger nic nie rejestruje?

Kontroler:

public class ReservationsController : Controller
{
        private readonly ApplicationDbContext _dbContext;
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly ILogger<ReservationsController> _logger;
        private readonly IRoomReservationService _reservationService;
        private readonly IVoucherService _voucherService;

        public ReservationsController(
            UserManager<ApplicationUser> userManager,
            ILogger<ReservationsController> logger,
            ApplicationDbContext dbContext,
            IRoomReservationService reservationService,
            IVoucherService voucherService)
        {
            _userManager = userManager;
            _logger = logger;
            _dbContext = dbContext;
            _reservationService = reservationService;
            _voucherService = voucherService;
        }
        [Authorize]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<JsonResult> CheckAvailableReservationHours()
        {
            return null;
        }
}

JavaScripts:

                var baseurl = window.location;
                var owner = document.getElementById("OwnerSelectComboBox").value;
                var roomId = document.getElementById("SelectedRoomList").value;
                var reservationDate = document.getElementById("datepicker").value;

                $.ajax({
                    url: baseurl + '@Url.Action("CheckAvailableReservationHours", "Reservations")',
                    type: 'POST',
                    success: function (msg) {
                        alert("SUCCESS");

                    },
                    error: function (xhr, textStatus, error) {
                        alert("ERROR");
                    }
                });

Mam cały czas Alert(Error) i nie potrafię odczytać błędu :(

0

Poprawiłem i wszystko działa jak należy:

$.ajax({
                    url: '@Url.Action("CheckAvailableReservationHours", "Reservations")',
                    type: 'POST',
                    data: {
                        "FullNameWithEmail": owner,
                        "RoomId": roomId,
                        "Date": reservationDate
                    },
                    success: function (response) {
                        alert(response);

                    },
                    failure: function (response) {
                        alert("failure");
                    },
                    error: function (response) {
                        alert("error");
                    }
                });

1 użytkowników online, w tym zalogowanych: 0, gości: 1