Razor Pages - bez JS, bez Ajax. Logika aplikacji czysto serwerowa

0

Witam.
Ktoś próbował, chciał, potrzebował? Jest to w ogóle realne, aby MVC było tylko serwerowe? Nie dbam o page refresh. Projekt jest bardzo mały, ale też chce go napisać kompletnie w NET Core. Nie chce javascriptów, nie chce ajaxów, nie chce angularów, reactów i innych frameworków. Chce 100% NET Core Razor Pages.

0

Jest realne. Skoro projekt jest mały i nie chcesz jsów, ajaxów itd. to w sumie nic innego jak Razor ci nie zostało.

2

Dlaczego miałoby nie być realne? 15 lat temu budowało się bez tych wszystkich wodotrysków i ludzie nie umierali patrząc po stanie populacji na ziemi. Masz tu świetne introduction do Razor Pages @ https://www.learnrazorpages.com/

0

Przykład, który prosi się tylko o javascript/ajax.
Strona dodawania zamówienia. Użytkownik wybiera produkty, które chce zamówić i dodaje je do listy. W momencie zatwierdzania formy, w metodzie OnPostAddProduct() lista jest pusta, albo null.

public class NewModel : PageModel
{
    public List<string> SelectedProducts {get;set;}

   public async Task<IActionResult> OnGetAsync()
   {
        SelectedProducts = new List<string>();
        return Page();
   }
   
   public async Task<IActionResult> OnPostAddProduct(string product)
   {
       SelectedProducts.Add(product);
       return RedirectToPage();
   }
}
<form method='post' asp-page-handler='AddProduct'>
    <input name="product" />
</form>

Skorzystałem z HttpContext.Session - serializowałem object listy do JSON, ale... jak przejdę do strony głównej (innej) i wrócę do dodawania zamówienia to lista jest zapamiętana i nie mam żadnego eventu, triggera, który wyłapałby, że to nie jest, tak zwany (przeze mnie) self redirect...

0

To jak to będzie z tą realnością, o której piszecie?

Learn Razor Pages - nie ma tutaj odpowiedzi na mój problem. ViewData, TempData odpadają.
Chociaż zauważyłem, że TempData z użyciem methody .Keep() działa jak HttpContext.Session.
Pomyślalem, że może webformsowe isPostBack() pomoże, ale nie ma czegoś takiego w Razor Pages. Nawet jakby się chciało zrobić swoje isPostBack()

MVC3 Page - IsPostback like functionality
ASP.NET MVC - Is IsPostBack still here?

Request w Razor Pages nie ma właściwości HttpMethod, ale ma Request.Method, który zwraca wartość tego co wywołuje OnPost() = "POST" i OnGet() = "GET". Nie pomaga.

Post-Redirect-Get and TempData with ASP.NET Core - też odpada. Tak jak pisałem wyżej TempData się "zeruje". Druga sprawa, ten przykład pokazuję edycję gotowego obiektu w bazie. Moim obiektem jest zamówienie, który ma listę produktów, ta lista nigdzie nie jest trzymana i sam Razor Pages nie chce jej "trzymać".

Chcecie powiedzieć, że Microsoft tego nie przewidział? Z góry założył, że jeśli robi się projekt webapp w ASP.NET Core to integralną częścią takiego oprogramowania jest jQuery? Oczywiście, w przypadku JS nie czepiam się takich bajerów jakie daje bootstrap, select, datepicker, datatables.net itp.

0

A Caching nie pomoże w problemie?:
https://www.learnrazorpages.com/razor-pages/caching

0

Chcecie powiedzieć, że Microsoft tego nie przewidział?

Ale co ma Microsoft do tego? Tak po prostu działa HTTP, to jest niezależne od języka i technologii. To protokół bezstanowy, każdy request jest przetwarzany oddzielnie. Więc:

  1. albo budujesz sobie formularz do wysłania po stronie klienta, a potem go wysyłasz na raz do serwera
  2. albo każdy produkt wysyłasz na serwer i:
  • tam go zapamiętujesz w tej nieszczęsnej sesji i z niej potem budujesz całe zamówienie;
  • odsyłasz pełną listę zgromadzonych do tej pory pozycji koszyka na widok (i tam trzymasz w jakimś hidden input) - lepsze od poprzedniego, bo nie używa sesji.

Z góry założył, że jeśli robi się projekt webapp w ASP.NET Core to integralną częścią takiego oprogramowania jest jQuery?

NIkt już nie używa jQuery, a tym bardziej w czasach Core.

0

NIkt już nie używa jQuery, a tym bardziej w czasach Core.

Większość szanujących się webów raczej nie używa jQuery ale patrząc na https://stackshare.io/jquery to jednak dużo firm przy nim zostało..

0

@szydlak @somekind
Sesja odpada. Nie mam jak wyłapać czy to jest "self refresh", czy na nowo otwarty page. Jeśli przejdę na główną stronę i wrócę do tworzenia nowego zamówienia, to lista z poprzedniego tworzenia mi się pokazuje. Właśnie w tym przypadku przydałby się isPostBack(), ponieważ wiedziałbym kiedy utworzyć obiekt listy na nowo.

W przypadku hidden input. Nie wiem czy robię to dobrze:

public class IndexModel : PageModel
{
    [BindProperty]
    public string SelectedItemsJson {get;set;}
    public List<string> SelectedItems {get;set;}

    public async Task<IActionResult> OnGetAsync()
    {
        if(string.IsNullOrEmpty(SelectedListJson))
        {
            SelectedItems = new List<string>();
            SelectedItemsJson = JsonConvert.SerializeObject(SelectedItems);
        }
        else
        {
            SelectedItems = JsonConvert.DeserializeObject<List<string>>(SelectedItemsJson);
        }

        return Page();
    }

    [HttpPost]
    public async Task<IActionResult> OnPostAddItem(string item, string json)
    {
        SelectedItems = JsonConvert.DeserializeObject<List<string>>(json);
        if (SelectedItems == null)
            SelectedItems = new List<string>();

        SelectedItems.Add(item);
        SelectedItemsJson = JsonConvert.SerializeObject(SelectedItems);

        return RedirectToPage();
    }
}
<form method="post" asp-page-handler="AddItem">
    <input name="item" autocomplete="off" autofocus/>
    <input name="json" type="hidden" asp-for="SelectedItemsJson"/>
</form>

Jakiś przykład mogę prosić na podstawie tego co wrzuciłem?

0

Może się wyraziłem niejasno... Nie działa mi to co pisałem wcześniej. Zależy mi bardzo żeby działało, więc te osoby, które twierdziły, że to realne, bardzo proszę, wręcz błagam o przykład.

0

Cookie Oriented Logic? :D

//read cookie from IHttpContextAccessor  
string cookieValueFromContext = _httpContextAccessor.HttpContext.Request.Cookies["key"];  

//read cookie from Request object  
string cookieValueFromReq = Request.Cookies["Key"];
public void Set(string key, string value, int? expireTime)  
{  
   CookieOptions option = new CookieOptions();  

   if (expireTime.HasValue)  
         option.Expires = DateTime.Now.AddMinutes(expireTime.Value);  
   else  
         option.Expires = DateTime.Now.AddMilliseconds(10);  
   
   Response.Cookies.Append(key, value, option);  
}
public void Remove(string key)  
{  
      Response.Cookies.Delete(key);  
}  

https://www.c-sharpcorner.com/article/asp-net-core-working-with-cookie/

Wysyłasz formsem, zapisujesz do cookie, odczytujesz tam gdzie trzeba, budujesz htmla na podstawie tych danych, itd?

Dobrze myślę?

0
AdamWox napisał(a):

return RedirectToPage(); - to przecież przekierowuje na stronę, czyli masz klasyczne PRG. Natychmiast po dodaniu czegoś do SelectedItemsJson odświeżasz stronę, więc zerujesz tę wartość. Użyj po prostu Page() i będzie działać.

0

@somekind: Owszem działa w ten sposób, ale jeśli mam jakieś kontrolki typu dropdown, w których wybieram jakieś parametry, a wypełniam ten dropdown w OnGet() to niestety lista tej kontrolki jest pusta przy takim zabiegu. Musiałbym te dane powtarzać w OnPost(). Druga sprawa, przy odświeżaniu przeglądarka pyta o potwierdzenie formularza co też może niedoświadczonego użytkownika "wystraszyć".

1

No cóż, nie można mieć wszystkiego.

0

@AdamWox, a próbowałeś może coś z Razor Components? (blazor - server side, .NET Core 3.0 preview 2).
Jeśli tak, taj znać jak poszło.

0

@thepeche:
Próbowałem, ale zbyt chaotyczna budowa tego Blazora. Fajna technologia, na prawdę super rozwiązanie. Jak znajdę więcej czasu to wrócę do tego bo myślę że warto. Mnie budowa czystego MVC odstrasza, dopiero Razor Pages mnie przekonało do ASP .NET Core, więc nie wiem czy moja opinia ma tutaj jakieś znaczenie.

0
thepeche napisał(a):

@AdamWox, a próbowałeś może coś z Razor Components? (blazor - server side, .NET Core 3.0 preview 2).
Jeśli tak, taj znać jak poszło.

Do samych postów/getów i wyświetlania - fajne, ale jak coś więcej chcesz to musisz invokować javaskrypt.

Jak ogarną upload plików bez potrzeby invokowania js to wrócę do niego.

0

@WeiXiao: Mnie to się marzy, aby Blazor pisało się tak jak w Angular 2+ i działał tak jak JS'owe frameworki. Czy tylko upload plików jest problemem u ciebie, czy jest coś jeszcze?

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