» »

ASP .NET MVC - kje začeti?

ASP .NET MVC - kje začeti?

simba89 ::

Živjo.
Za seminarsko nalogo moram narediti spletno aplikacijo v ASP .net.
Vendar moramo tudi vso snov naštudirati sami.
Poznam osnove C#.

Kje sploh začeti, a so kakšni dobri tutoriali za ASP .net MVC? Trenutno bolj kot ne tavam v temi
in mi nič jasno.

Sem kupil na Udemyju tale tečaj: https://codewithmosh.com/courses/enroll...
vendar mi ne razjasni osnovnih pojmov.

Pozna kdo kakšno res dobro stran, tutorial za začetnike?

Hvala.

Netrunner ::

Mogoče youtube ali google?
Doing nothing is very hard to do... you never know when you're finished.

DOOM_er ::

Robots will steal your job. But that's OK

simba89 ::

Hvala DOOM_er, nekaj takega sem iskal.
LP

hendriks ::

Si prepričan da moraš, res moraš narediti aplikacijo v ASP.NET MVC? Ker ta tehnologija je že malce outdated. Kaj če bi asistentu/predavatelju predlagal, da bi raje naredil frontend v Angular/React/Vue in pa API v .NET Core? Pomojem bi še raje videli, da narediš v tem, ker bi s tem pokazal, da te trenutne tehnologije zanimajo..

simba89 ::

Sem tudi sam to razmišljal in če se že moram učiti, se raje učim stvar, ki je trenutno v uporabi, ne pa neke "zastarele" tehnologije in pristope.
Je pa res, da o Angular/React/Vue ne vem 0% in bom moral iti povsem od začetka. Udemy is my friend :D
Hvala za koristne nasvete.

LP

acookook ::

Sicer se gre za razor pagee, sem pa spet pred izzivom, kjer ne razumem najbolje te zadeve. Pogledal sem si uradno dokumentacijo, ki mi jo je poslal en uporabnik na SO Še vedno pa imam težave. Najprej bi read vzpostavil 2 layouta, pri čemer se avtomatsko redirecta na login, v primeru, da cookie ne obstaja. Login page bo zaenkrat issual neke dummy zadeve. Enostavno ne vem pravilno narediti redirecta. med različnimi layouti in podstranmi.
.

Wrop ::

Tega (redirecta) pomoje ni dobro pisat v view (razor pages). Redirect narediš na url naslov. To pa lahko narediš precej na začetku oz. bi to moralo biti v .net core dovolj enostavno za skonfigurirat, da tega ni treba delat v view-ih.
Na layout se pa lahko sklicuješ v vsakemu razor page posebej. Če ima login stran svoj layout se sklicuješ na ta layout tam. Na drug layout se pa slicuješ v drugih view-ih.

acookook ::

Moram priznat, da te ne razumem najbolj, oz. kar razumem je, da
@page
atribut pobrišem?

Ker če to naredim v _LoginLayout.cshmtl in v ViewStart.cshtml napišem
@{
    Layout = "_LoginLayout";
}

Dobim prazno stran z vrnjenim JSON arrayjem, ki bi moral nafilat eno boostrap tabelo. Mislim ne vem no. Očitno ne vem poiskat pravih informacij, da mi uspe pravilno napisat strukturo spletne strani.
.

Zgodovina sprememb…

  • spremenil: acookook ()

Wrop ::

Sem še pogledal kako se naredi en enostaven primer za .net core. Ker v .net standard so stvari malo drugačne. Microsoft ponuja cel kup možnosti, na koncu pa je pridelal cel kup ene zmede. Več babic, kilavo dete.

Naredi nov projekt core web app.
Imaš dve strani. Index in Login. Vsak ima svoj layout.
V shared direktoriju ustvari nov layout "_LayoutLogin.cshtml". Na tega se slicuješ v Login.cshtml datoteki.

Login.cshtml lahko zgleda tako. Nekaj enostavnega.
@page
@model WebApplicationTest.Pages.LoginModel
@{
    Layout = "_LayoutLogin";
}

<h2>Login</h2>

<form asp-action="login" method="post">
    <label for="name">Name</label>
    <input type="text" name="Name" asp-for="@Model.Name" /> <br />
    <label for="password">Password</label>
    <input type="password" name="Password" asp-for="@Model.Password"/> <br />
    <input type="submit" value="Login"/>
</form>


Login.cs

...
        [BindProperty]
        public string Name { get; set; }

        [BindProperty]
        public string Password { get; set; }

        ...

        public async Task<IActionResult> OnPostAsync()
        {

            if (Name == "1" && Password == "2") {

                var claims = new List<Claim>
                {
                    new Claim("user", Name),
                    new Claim("role", "Member")
                };

                var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

                var authProperties = new AuthenticationProperties
                {
                    //AllowRefresh = <bool>,
                    //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10),
                    //IsPersistent = true,
                    //IssuedUtc = <DateTimeOffset>,
                    //RedirectUri = <string>
                };

                await HttpContext.SignInAsync(
                     CookieAuthenticationDefaults.AuthenticationScheme,
                     new ClaimsPrincipal(claimsIdentity),
                     authProperties);

                return Redirect("/Index");

            }

            return Redirect("/Login");
        }
...


Se pravi, če ni pravega gesla te vrača na Login. Če je, nastavi piškotke in te redirecta na Index. Tu lahko kasneje popraviš, da te vrne na prejšnjo stran.

Index.cs je standard. Nad razredom imaš dodaten atribut, da je potrebno imeti avtorizacijski piškotek s shemo, da je stran dosegljiva, če ne te vrže ne login.

    [Authorize( AuthenticationSchemes = Startup.CookieScheme )]
    public class IndexModel : PageModel
    {
        private readonly ILogger<IndexModel> _logger;

        public IndexModel(ILogger<IndexModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {

        }
    }


Index.cshtml je nespremenjen in ima običajen layout.

Ostane še Startup.cs.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplicationTest
{
    public class Startup
    {

        public const string CookieScheme = "Cookies";
        public IConfiguration Configuration { get; }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();

            services.AddAuthentication(CookieScheme) // Sets the default scheme to cookies
            .AddCookie(CookieScheme, options =>
            {
                options.AccessDeniedPath = "/login";
                options.LoginPath = "/login";
            });

        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
            }

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseCookiePolicy(new CookiePolicyOptions() {  });

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }
    }
}


Če hočeš dva različna layouta na straneh, ko si že prijavljen, pa poglej, če se da kaj narediti s samo strukturo projekta in direktorijev in kako je s tem povezan _ViewStart.cshtml datoteka, ker mislim, da jo lahko dodaš v vsak direktorij, tam pa se potem vse strani sklicujejo na layout zapisan v _ViewStart.cshtml. Nisem čisto prepičan kako je.

acookook ::

Ja, za ViewStart.cshtml sem že nekaj gledal, je neka koda, ki preverja userjev identity, vendar kolikor razumem mi je že tisti tip na SO odogovoril, da ta tutorial ni za identity, različne kombinacije vrednosti atributa
@page
pa me na žalost ne peljejo nikamor. Bom se še nekaj probal naumiti, magari nekaj brute force. V primeru, da mi uspel pa se tega ne bom tikal. Pa hvala.
Sem še pogledal kako se naredi en enostaven primer za .net core. Ker v .net standard so stvari malo drugačne. Microsoft ponuja cel kup možnosti, na koncu pa je pridelal cel kup ene zmede. Več babic, kilavo dete.
Je en funny meme ko se tip prav norčuje, koliko je teh tehnologij in standardom. Ampak in the end ima vsak ekosistem neke svoje sitnice.
.

Wrop ::

Tukaj na Git imaš še nekaj primerov, če ti bo kaj prišlo prav.

User identiy pa preverjaj na nivoju page modela ali pa globalno. V view (.cshtml) se tega raje izogibaj.

Drugače glede microsofta bi res lahko na dnevni bazi izdajali katalog novih memov. Totalno sranje. Samo še razvoj na androidu ga prekaša, vsaj kar sem uspel videti.

Najbolje, da se držiš enega standarda in ene tehnologije pri začetkih.

acookook ::

Hah, bom videl bom videl koliko bom še vztrajal, pravim ta jeba z menjavanjem layoutov me nervira. Sicer sploh ne vidim primerov z večimi layouti 8-O
.

Zgodovina sprememb…

  • spremenil: acookook ()

acookook ::

Torej imam en mikroservis, kjer podatke lahko pridobim tudi preko gRPC, deluje pa zadeva samo lokalno z razvijalskimi certifikati. Če kličem grpc endpoint, ki je teče iz docker kontejnerja dobim sledeč exception: https://cdn.discordapp.com/attachments/...
V tej točki mi iskreno niti ni jasno kaj točno moram narediti oz. vem da moram:
- generirati certbot certifikat za dotičen mikroservis
- vključiti ta certifikat v docker image, da bom lahko na nek način to spravil mimo github CI (okej, lahko kar pushal dev docker image, kar pa ni korektno),
- urediti, da bo to laufalo na kubernetes clustru
Težavo imam že pri samem generiranju certifikata, na docker kontejnerju. Vsi vodiči, hočejo še, da poženem docker-compose in še kaj drugega, kar pa v mojem primeru (kolikor razumem) ne pride v poštev. Jasno mi, je da določenih stvari ne razumem, me pa zanima kje (razen uradne dokumentacije) lahko izvem več, sploh ker vidim, da nekatera podjetja tu na forumu iščejo znanje gRPC in (ASP) .NET Cora.
.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

ASP .NET Middleware

Oddelek: Programiranje
9618 (339) FireSnake
»

ASP, ASP.NET

Oddelek: Programiranje
331262 (238) acookook
»

Asp.net

Oddelek: Programiranje
181990 (673) acookook
»

Avtentikacija - najboljsa praksa?

Oddelek: Izdelava spletišč
212305 (1670) techfreak :)
»

ASP.NET + C# vprašanje

Oddelek: Programiranje
342758 (1772) Morenov

Več podobnih tem