'Loding pages by posting parameters

The subject might not be clear since I couldn't find a better way to express it.

I am developing a web application using ASP.NET Core 6.0 with Razor Pages. Our previous application was an SPA using Ext JS where any call to server was returning only data and where I was also able to make any kind of call (GET/POST) to get the data.

enter image description here enter image description here

For example, in the above picture from my old application, I make an ajax call with POST to get the list of periods when I open this page. I make a POST because I am sending the period type in my request payload. Sure I can pass these parameters in a GET request, however my other views have many criteria, so passing these criteria in the query string is not what I want. So, I decided to make it a standard to make my calls with POST method if there are any criteria payload, make GET request only when fething an entity with a simple key parameter (like Id) or GET any list that doesn't have any criteria.

Now, I am quite confused how to do same thing in my new ASP.NET Core Razor Pages web application. Normally, the menu items navigate to the page using link as below, which makes a GET request:

<a asp-area="System" asp-page="/ProfessionList">@AppLocalizer["Profession List"]</a>
<a asp-area="System" asp-page="/PeriodList">@AppLocalizer["Profession List"]</a>

In order to make a POST request, I replaced the menu item for period list as following which makes a POST request with a default periodType payload:

<a asp-area="System" asp-page="/ProfessionList">@AppLocalizer["Profession List"]</a>
<form asp-area="System" asp-page="/PeriodList" method="post">
  <input type="hidden" name="periodType" value="1" hidden />
  <button type="submit" >@AppLocalizer["Period List"]</button>
</form>

enter image description here

And the corresponding PeriodType.cshtml.cs file is as following:

[Authorize]
public class PeriodListModel: BaseEntityListPageModel<List<JsonPeriodEx>> {

  public PeriodListModel(ILogger<BaseEntityListPageModel<List<JsonPeriodEx>>> logger, WebApi webApi) : base(logger, webApi) {
  }

  public IActionResult OnGet() {
    PageData = JsonConvert.DeserializeObject<List<JsonPeriodEx>>(TempData["PageData"].ToString());

    return Page();
  }

  public async Task<IActionResult> OnPostAsync(int periodType) {
    var jsonResult = await _WebApi.DoPostAsync<List<JsonPeriodEx>>("/PeriodEx/GetList", new[] { new { Property = "periodType", Value = periodType } });
    if (jsonResult.IsLoggedOut)
      return RedirectToPage("/Login", new { area = "Account" });

    if (jsonResult.Success) {
      PageData = jsonResult.Data;
      TempData["PageData"] = JsonConvert.SerializeObject(PageData);

      return RedirectToPage("/PeriodList");
    } else {
      return RedirectToPage("/Error");
    }
  }
}

OnPostAsync successfully binds to the posted periodType parameter and gets the list of periods. Now, at the end of a successful call I want to follow the Post/Redirect/Get pattern and redirect to OnGet with the data from OnPostAsync, which is stored in TempData.

Now, according to the above scenario, is my approach, explained above, correct or should I implement it differently?

Thanks in advance



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source