Przekazanie Id modelu "nadrzędnego"

0

Cześć,

Postaram się wyjaśnić mój problem na tyle jasno na ile potrafię :) proszę o wyrozumiałość.
Mam następujące akcje w kontrolerze:

 [HttpGet]
        public IActionResult AddWorker(int WorkplaceId)
        {
            var model = new WorkerModel()
            {
                WorkplaceId = WorkplaceId
            };
            return View(model);
        }

        [HttpPost]
        public IActionResult AddWorker(WorkerModel model)
        {
            var workerModel = _workerService.AddWorker(model);
            return RedirectToAction("EditWorkplace", "Workplace", new { Id = workerModel.WorkplaceId });
        }

        [HttpPost]
        public IActionResult DeleteWorker(int IdWorker)
        {
            var worker = _workerService.GetWorker(IdWorker);

            if (worker == null)
            {
                ViewBag.ErrorMessage = $"Pracownik o id = {IdWorker} nie został odnaleziony";
                return View("NotFound");
            }

            _workerService.DeleteWorker(IdWorker);
            return RedirectToAction("EditWorkplace", "Workplace");
        }

Widok ekranu:
zrzut.PNG

Chciałbym, aby użytkownik po kliknięciu "Usuń" na pracowniku nie był nigdzie przekierowywany, pozostawałby na tym samym ekranie. Niestety aby to zrobić muszę chyba przekazać do metody POST DeleteWorker Id Workplace, na którym usunięcie nastąpiło. W tej chwili przekazuje tylko Id pracownika. Jak pobrać Id z obecnego widoku? Ekran powyżej to właśnie "EditWorkplace".

0

A nie masz tego ID w urlu?

0

No więc ID można albo wyciągnać z urla, albo wyrenderować w jakimś atrybucie data-workplaceId podczas generowania przycisku "Usuń". Osobiście skłaniałbym się ku tej drugiej opcji, ale nie wiem jak renderujesz ten przycisk. :)

0

Chciałbym, aby użytkownik po kliknięciu "Usuń" na pracowniku nie był nigdzie przekierowywany, pozostawałby na tym samym ekranie.

No to w czym problem?
O Ajaxie/ Fetch API nie słyszałeś? Jak nie, to musisz poczytać.
Robisz asynchroniczne zapytanie na backend z przeglądarki z żądaniem usunięcia rekordu z bazy i nic nie musisz przeładowywać.
ID przechowujesz tak jak somekind Ci napisał, albo każdy inny sposób który jest sensowny.

Inna sprawa już jest taka, że musisz to sensownie na backendzie sprawdzać, czy ktoś próbuje usunąć zasób do którego ma dostęp, bo wystarczy prosta podmianka idka w atrybucie i już jesteś zhackowany

Odpal jakiś dobry tutorial/dokumentację, bo pytania które ciągle zadajesz są tak podstawowe, że będą zawierać się w każdym how to i zostały już milion razy przewałkowane.

0
somekind napisał(a):

No więc ID można albo wyciągnać z urla, albo wyrenderować w jakimś atrybucie data-workplaceId podczas generowania przycisku "Usuń". Osobiście skłaniałbym się ku tej drugiej opcji, ale nie wiem jak renderujesz ten przycisk. :)

Poniżej kod

<div class="card-body">
                            @if (Model.Workers.Any())
                            {
                                @foreach (var worker in Model.Workers)
                                {
                                    <h5 class="card-title">@worker.Name</h5>
                                    <a asp-controller="Worker" asp-action="EditWorker" asp-route-id="@worker.Id" class="btn btn-primary">Edytuj</a>
                                    <button asp-controller="Worker" asp-action="DeleteWorker" asp-route-IdWorkplace="@worker.Id" type="submit" class="btn btn-danger">Usuń</button>
                                    <img class="img-thumbnail rounded float-right" width="60" height="60" src="@("~/img/" +(worker.PhotoFilePath ?? "noimage.jpg"))" asp-append-version="true" />
                                }
                            }
                            else
                            {
                                <h5 class="card-title">Brak pracowników</h5>

                            }
                        </div>
urke napisał(a):

O Ajaxie/ Fetch API nie słyszałeś? Jak nie, to musisz poczytać.

Słyszałem, ale póki co jest to dla mnie czarna magia, zaczynałem od aplikacji z tutoriala, później zacząłem robić własną, teraz buduję wspólnie z kilkoma znajomymi kolejną, bardziej rozbudowaną. Jeśli masz jakiś sensowny poradnik godny polecenia (w sieci jest mnóstwo, pytanie który z nich ma jakąkolwiek wartość) to prośba o podesłanie :) Pozdr

0
somekind napisał(a):

No więc ID można albo wyciągnać z urla, albo wyrenderować w jakimś atrybucie data-workplaceId podczas generowania przycisku "Usuń". Osobiście skłaniałbym się ku tej drugiej opcji, ale nie wiem jak renderujesz ten przycisk. :)

Dzięki, chyba sobie poradziłem:

        [HttpPost]
        public IActionResult DeleteWorker(int IdWorker, int IdWorkplace)
        {
            var worker = _workerService.GetWorker(IdWorker);

            if (worker == null)
            {
                ViewBag.ErrorMessage = $"Pracownik o id = {IdWorker} nie został odnaleziony";
                return View("NotFound");
            }

            _workerService.DeleteWorker(IdWorker);
            return RedirectToAction("EditWorkplace", "Workplace", new { Id = IdWorkplace });
        }

A w widoku przekazałem to w ten sposób:

<button asp-controller="Worker" asp-action="DeleteWorker" asp-route-IdWorkplace="@Model.Id" asp-route-IdWorker="@worker.Id" type="submit" class="btn btn-danger">Usuń</button>

Czy o takie rozwiązanie Ci chodziło?

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