Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Miks tää ei toimi?

Sivun loppuun

Daimeri [27.10.2019 14:15:07]

#

Ohjelma ei siirry privacy sivulle vaikka debukkauksessa koodi kyllä tuohon kohtaan pääsee käsiksi


Frontti

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<form method="post">
    <input type="text" name="url">
    <input type="submit">

    <a asp-page-handler="url" asp-route-id="@Model.OnTest()"></a>

</form>

c# tiedosto

public class IndexModel : PageModel
    {

        public IActionResult  OnTest()
        {

            return RedirectToPage("Privacy");
        }

    }
}

Grez [27.10.2019 14:44:01]

#

Onko sulla olemassa sivu "Privacy"?

Daimeri [27.10.2019 14:45:34]

#

Joo kyllä on

Lisäys: Se on siis ihan defaultti sivu joka tulee mukana kun luo uuden projektin.

Grez [27.10.2019 14:56:40]

#

Niin joo siis tuossahan palautat Mallista IACtionResultin ja laitat sen route-id:ksi, niin eihän tuossa ole mitään järkeä.

Lisäys:

Joo eli sanoisin, että tuo toimii juuri niin kuin olet pyytänytkin, saat sivulle linkin jonka url on:
/Home/Index/Micro­soft.Asp­Net­Core.Mvc.­Re­di­rect­To­Page­Result?­handler=url

Mitään järkeä missään noissa laittamissasi koodeissa en kyllä tosiaan näe.

Eli mallin OnTest -funktio paluuarvoksi määrittämäsi RedirectToPage -objektio muuttuu merkkijonoksi (.ToString()) muotoon "Microsoft.AspNetCore.Mvc.RedirectToPageResult"

Daimeri [27.10.2019 15:09:09]

#

Kiitos. tässä vasta alottelen tuota asp.net hommaa. miten kutsun metodia ja palautan metodista tempdatan tekstin takaisin.

Grez [27.10.2019 15:13:04]

#

Niin siis voisitko avata vähän mitä olet tekemässä? Missä kohdassa haluat kutsua metodia ja miten tempdata (asp.net ympäristössä data jonka sivu voi asettaa ja jonka seuraava sivu voi sitten käyttää) liittyy asiaan?

IActionResult tyyppisiä objekteja ei ole oikein järkeä palauttaa muista kuin kontrollereista, eli jos kutsut View:stä jotain metodia joka palauttaa RedirectToPage tai muun joka toteuttaa IActionResultin niin olet kyllä pahasti metsässä.

Tällä hetkellä olet siis tehnyt linkin. Jos yrittäisin arvata jotain, niin haluaisit että linkki ohjaisi "Privacy" sivulle. Sitä varten ei tarvitse tehdä yhtään mitään minnekään muualle kuin Viewiin (ei siis OnTest -metodia tms) ja viewiin riittää kun laitat

<a asp-action="Privacy">Linkki privacy sivulle</a>

Daimeri [27.10.2019 15:41:18]

#

Kiitos grez viestini oli hieman epäselvä. Alunperin koitin siis tehdä metodin joka palauttaa metodista saadun arvon näkymään fronttiin. poistin tuosta iactionresultista kaiken koodin kun huomasin että se ei siirry halutulle sivulle. Ongelmani on se, että en tiedä kuinka käynnistän metodin frontinkautta ja kuinka saan metodista saadun arvon näkymään frontissa. Esim jos frontissa on inputbox ja nappi inputboxiin kirjoitettu tieto siirtyy muuttujaan joka on backendissä backendistä oleva arvo siirtyy fronttiin. arvon ei tarvitse muuttua matkalla koska haluaisin vain oppia kuinka kutsutaan metodia frontista ja näytetään saatu tieto frontissa

Grez [27.10.2019 15:52:10]

#

Frontista (selaimelta) käsin voi "kutsua metodeita" backistä (palvelimelta) tekemällä sivulatauksia tai ajax-kutsuja palvelimelle päin.

Jos haluat välittää tietoa frontista backiin, niin se menee yksinkertaisesti esim.

Viewiin:

<form asp-action="Metodi">
    <input name="Teksti" placeholder="Kirjoita tähän" />
    <input type="submit" />
</form>

(Home)Controlleriin:

public IActionResult Metodi(string Teksti)
{
    return Content($"Kirjoitit tekstin {Teksti}");
}

Eli tuossa weppiselaimen lähettämä sivupyyntö käynnistää Controllerilla olevan funktion ("metodin") Metodi ja välittää sinne Teksti-nimisen muuttujan. Jonka jälkeen backi ajaa metodin ja palauttaa saman tekstin lisättynä alulla "Kirjoitit tekstin" frontille vastaamaan sivupyyntöön.

Toki MVC-henkisempää olisi laittaa selaimelle lähetettävä data malliin (Model) ja sitten näkymässä (View) muotoilla se osaksi html-sivua, mutta tein nyt yksinkertaistetun esimerkin jossa controller palauttaa dataa suoraan frontiin (selaimelle)

Huomautan vielä että kun alunperin olit laittanut Viewiin

<a asp-page-handler="url" asp-route-id="@Model.OnTest()"></a>

, niin tuota OnTest-kutsua ei ajeta frontilla (selaimessa) vaan backissa (palvelimella)

Daimeri [27.10.2019 17:44:23]

#

Kiitos viestistäsi. Sain tämän toimimaan jotenkin. Seuraavaksi ihmettelen miksi metodin nimi saa olla tässä tapauksessa vain OnPost eikä esimerkiksi OnPostjotain

Seuraava ongelma on kuinka vaihdan napin nimen nyt se nimi tulee jostain automaattisesti nimellä "Submit Query"

Tämä koodi lataa halutun url osoitteen koodin stringiin ja laskee merkit.
Sen jälkeen palauttaa väliaikaisesti näytölle saadun tuloksen.

Backendin koodaaminen tuntuu helpommalta kun ei ole tästä frontti hommasta mitää kokemusta.

<form method="post">
    <input type="text" name="url">
    <input type="submit">
</form>

@if (Model.Message != null)
{

    <div class="alert alert-info alert-dismissible" role="alert">
        <button type="button" class="close" data-dismiss="alert" aira-label="close">
            <span aria-hidden="true">&times;</span>
        </button>
        @Model.Message
    </div>
}
[BindProperty]
       public string Url { get; set; }
       [TempData]
       public string Message { get; set; }


       public async Task <IActionResult> OnPost()
       {
         Url = Request.Form["url"];
           ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
           var sourceData = new System.Net.WebClient();
           string sourceString = await sourceData.DownloadStringTaskAsync(Url);
           int i = sourceString.Length;
           Message = i.ToString();
           return Page();
       }
   }

Lisäys: Nyt sain napin vaihdettua käyttämällä boostrap hommaa. Anteeksi jos kyselen täälä tyhmiä. Kiitos avusta kumminkin. :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta