Pomoc z AJAX Call

0

Podążam za microsoftową dokumentacją, działam sobie w tym projekcie Movie w MVC i rozwijam dalej.
Przyszedł czas na AJAX Calle, bo bez tego ta strona jakoś słabo wygląda. Z tego co widze, nie ma nic w microsoftowej dokumentacji o tym i jak używać w MVC, chyba, że to ukrywają przede mną.
Do sedna, tak wygląda View

<div>
    <h2>ID</h2><h2 id="movieId"></h2>
    <h2>Name</h2><h2 id="nameId"></h2>
    <h2>Genre</h2><h2 id="genreId"></h2>

    <input type="button" onclick="BtnClick(1)" value="clickme"/>
</div>

skrypt ajax używając jQuery i tu się chyba pojawia problem:

function BtnClick(movieId) {
        $.ajax({
            url: "/Home/GetMovieByIdAjax",
            data: { movieId: movieId }, //czy id: movieId
            method: "GET",
            succes: function (data) {
                data = JSON.parse(data);
                $("#movieId").text(data.Id)
            },
            error: function (err) {
                console.log(err)
            }
        })
    }

Nie umiem przekazać parametru (tu twardo wstawiłem do HTML), bo tak to bez parametru mi się udaje otrzymywać dane.
No i jeszcze z kontrolera:

 public JsonResult GetMovieByIdAjax(int id)
        {

            var movie = _context.Movies.FirstOrDefault(m => m.ID == id);

            var json = JsonConvert.SerializeObject(movie);

            return Json(json, System.Web.Mvc.JsonRequestBehavior.AllowGet);
        }

Przepraszam, może ktoś zerknie i znajdzie szybko problem, bo z tym JS a w dodatku jQuery coś mi nie idzie.

0

Zmień na:

data: { id: movieId }, //czy id: movieId // id jako nazwa parametru

albo

zmień url na

 url: "/Home/GetMovieByIdAjax/"+movieId,

i usuń

data: { movieId: movieId }, //czy id: movieId
0

Jednak sprawa nie jest prosta: mianowicie, być może w referncjach jest problem, gdy dodaje using System.Web.Mvc, jak sugeruje intellisense wyskakuje masa błędów.
To jest error z przeglądarku, próbowałem następujących sposobów:
Dodanie Microsoft.AspNetCore.Mvc.NewtonsoftJson w starup:

services.AddControllers().AddNewtonsoftJson();
            services.AddControllersWithViews().AddNewtonsoftJson();
            services.AddRazorPages().AddNewtonsoftJson();

screenshot-20210505162220.png

screenshot-20210505162653.png

W tej linicje jest problem:

0

A zainstalowałeś paczkę Microsoft.AspNetCore.Mvc.NewtonsoftJson?

1

Upewnij się, że masz newtonsoft dla , AspNetCore, CORE. Moze podpowiada Ci mvc bo masz ten pakiet dla mvc.

1

Udało się! Tera potrzebuje speca od jQuery. Niech mi wyjaśni jedno:
dlaczego działa to:

document.getElementById("gameName").innerHTML = data.Name;

a to nie:

 $("gameName").text(data.Name)

?

Mam więcej pytań, otóż rozumiem, że można te AJAX Calle robić bez jQuery?
Nie jestem tak zielony, tak wiem, że są biblioteczki? typu Axios itd. ale czemu wszystkie posty, nawet sprzed roku ludzie używają dalej AJAX jQuery?

Otóż, przeczytałem, że JsonRequestBehavior.AllowGet() jest derpicated,
pewno dlatego sugerują stare biblioteki i sprawia problemy.
znalazłem taki sposób:

public JsonResult GetGameById(int id)
        {
            var game = _context.Game.FirstOrDefault(g => g.GameId == id);

            var gameSerialized = JsonConvert.SerializeObject(game);

           
            return Json(gameSerialized, new JsonSerializerSettings());
        }

i View:

<h2>Game Name:</h2><h2 id="gameName">Have to be updated</h2>
<br />
<input type="button" onclick="BtnClick(1)" value="click me" />

Tylko szkoda, że nie znalazłem dokumentacji na temat AJAX jQuery w MVC.
Póki co rozumiem to, że pobieram coś z bazy danych, następnie JsonConvert serializuje z bazy danych do formatu Json, dalej zwracam obiekt JSON z ustawieniami jakie posiadam (JsonSerializerSettings) a w JS po stronie klienta, po zwróceniu obiektu parsuje z JSON na Vanilla/Raw JS.

Cięzki dzień, w dodatku wolny. Powiedzmy, że czegoś się nauczyłem.
Fajnie, jakby ktoś coś od siebie dorzucił w tym temacie, mając doświadczenie. Co? Nie wiem.

0
  1. Używaj debugera i narzędzi programistycznych w przeglądarce.
  2. Dla ajaxa nie ma znaczenia czy to mvc czy cokolwiek. Leci coś po http i coś przychodzi a rezultat to nie musi być json A np int albo string. Na Twoje błędy żadna dokumentacja nie pomoże.
  3. A $("gameName").innerHtml = data.Name działa?

Ogólnie to dość stara technologia. Solidne podstawy warto mieć ale są fajniejsze rzeczy. Jakieś Reacty, Blazory, Fluttery itp.

0

Nadejdzie czas na potężnego Blazora, ale, póki co chce porobić w tym MVC i RazorPages.
Nic i tak nie ucieknie a sporo myślę w tym Blazorze się przyda.
I tak chce siedzieć i ogarnąć cały back-end ale jest taka masa rzeczy, które mnie po prostu omija i nawet czytając całe dokumentacje nie dochodze do tych rzeczy i nie wiem skąd one się biorą. F12 w VStudio tera katuje zawsze i czytam, ile się da.
Robienie całej aplikacji w .NET - średnio mi się podoba, nie powiem. Cały back-end w .NET i front w czymś innym? Już dużo bardziej, ale póki co robiłem tylko bardzo proste aplikacje.
React fajny, ale mnie troche przytłoczył z tym reduxem. Raz wydaje mi się bardzo łatwe ale zaraz znowu wielki problem z tym miałem :). Celuje w Blazor i tego następce Xamarina jeśli chodzi o fronta a i jeszcze bardzo dluga droga w tym back-endzie.

1

Hmm. Przyznaje, że nie dawało mi to spokoju bo metoda, która jest deprecated nie powinno powodować aż takich problemów.
Sprawdziłem i jestem na 99% pewny, że utworzyłeś projekt ** asp.net core mvc** i wkleiłeś bez zastanowienia jakiś przykładowy kod z projektu asp.net mvc..
Przestrzeń nazw System.Web.Mvc.* chyba nawet nie powinna istnieć w projekcie Net Core bo to jest pakiet dla starego .Net Framework 4.* co pokazuje się nawet pod żółtą ikoną z odpowiednim komunikatem w Solution Explorer.
Więc chyba jednak się niczego nie nauczyłeś.

Jeśli szukasz przykładów to zwracaj uwagę czy to jest dla .net Core albo .NET 5.0.

0

Masz jeszcze raz, w nowym projekcie screenshot-20210506123710.png
screenshot-20210506123738.png

1

A skąd przekleiłeś fragment z JsonRequestBehavior? Domyślnie metoda Json, której używasz do zwracania nie przyjmuje tego parametru.

0

Dobra z czaiłem o co wam chodzi, macie racje.

To podbije pytanie, czy da się normalnie zwracać rekord z bazy z related data i zwrócić jako Json?
Przkładowo:

screenshot-20210506125259.png

1

Da się ale powinieneś napisać własne klasy do przesyłania danych

public class PublisherDTO
{
 ...
 public List<GameDTO> Games{get;set;}
}

public class GameDTO
{
...
}

Pobrać dane z bazy, zmapować na *DTO i te dane wysłać. Wtedy masz kontrolę nad tym co się wysyła.

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