I have a problem with the ASP.NET CORE project.
On page Filter, when I click "filter" for the first time, the ViewModel Post back with value, and everything is ok, the result will display.
When I click "filter" again without change any condition. the ViewModel Post back with a null value.
how can I fix this issue?
Page code:
@model ListRenewalViewModel
@inject IAuthorizationService AuthorizationService
@inject IOptions<GeneralOptions> _generalOptions
@{
ViewData["Title"] = "Renouvellement et relance - Clients résidentiel";
var isPageReadOnly = (await AuthorizationService.AuthorizeAsync(User, AuthorizationPolicies.TransactionResidential_ReadOnlyAccess)).Succeeded;
}
@section Breadcrumb {
<section class="container-fluid bg-white shadow-sm">
<div class="container">
<div class="d-flex align-items-center justify-content-between align-content-lg-between flex-wrap">
<nav>
<ol class="breadcrumb--custom py-2">
<li class="breadcrumb--item">Clients résidentiels</li>
<li class="breadcrumb--item active">Renouvellement et relance</li>
</ol>
</nav>
</div>
</div>
</section>
}
<section class="row">
<div class="col-12">
<div class="card">
<div class="card-header bg-white">
Renouvellement et relance
</div>
<form class="needs-validation" method="post" asp-action="Filter" asp-controller="Renewal">
<div class="card-body">
<div class="form-row">
@*Renewal*@
<div class="col-lg-6 mb-3 mb-lg-0">
<div class="card h-100">
<div class="card-header">
<div class="custom-control custom-radio">
<input asp-for="RenewalRelaunch" type="radio" id="CheckRenewal" class="custom-control-input w-100 cursor--pointer"
value="@RenewalRelaunch.Renewal">
<label for="CheckRenewal" class="custom-control-label">Renouvellement</label>
<div class="invalid-feedback">
<span asp-validation-for="RenewalRelaunch"></span>
</div>
</div>
</div>
<div class="card-body">
@*these fields are required only if renewal is selected*@
<div class="custom-control custom-radio">
<input asp-for="RenewalStatus" type="radio" id="CheckNotRenewed" class="custom-control-input"
value="@RenewalStatus.NotRenewed"
disabled="@(Model.RenewalRelaunch == RenewalRelaunch.Relaunch)">
<label for="CheckNotRenewed" class="custom-control-label">Non renouvelé</label>
</div>
<div class="custom-control custom-radio">
<input asp-for="RenewalStatus" type="radio" id="CheckRenewedUnpaid" class="custom-control-input"
value="@RenewalStatus.RenewedUnpaid"
disabled="@(Model.RenewalRelaunch == RenewalRelaunch.Relaunch)">
<label for="CheckRenewedUnpaid" class="custom-control-label">Renouvelé - Non payé</label>
<div class="invalid-feedback">
<span asp-validation-for="RenewalStatus" class="text-danger"></span>
</div>
</div>
@if (Model.ShowContractCheckbox)
{
<div class="custom-control custom-checkbox">
<input asp-for="IsContractChecked" type="checkbox" class="custom-control-input"
disabled="@(Model.RenewalRelaunch == RenewalRelaunch.Relaunch)">
<label asp-for="IsContractChecked" class="custom-control-label"></label>
<div class="invalid-feedback">
<span asp-validation-for="IsContractChecked" class="text-danger"></span>
</div>
</div>
}
</div>
</div>
</div>
@*Relaunch*@
<div class="col-lg-6 mb-3 mb-lg-0">
<div class="card h-100">
<div class="card-header">
<div class="custom-control custom-radio">
<input asp-for="RenewalRelaunch" type="radio" id="CheckRelaunch" class="custom-control-input w-100 cursor--pointer"
value="@RenewalRelaunch.Relaunch">
<label for="CheckRelaunch" class="custom-control-label">Relance</label>
<div class="invalid-feedback">
Veuillez sélectionner une option entre Renouvellement ou Relance.
</div>
</div>
</div>
<div class="card-body">
<p class="mb-3">Relance pour des superficies totales de 5 000 pi<sup>2</sup> et moins.</p>
<div class="form-inline">
<label class="mr-3">Appliquer jusqu'à </label>
<select asp-for="RelaunchYearId" class="custom-select w-auto"
asp-items="ViewBag.YearSource"
disabled="@(Model.RenewalRelaunch == RenewalRelaunch.Renewal)">
<option value="" selected>--Option--</option>
</select>
<div class="invalid-feedback">
<span asp-validation-for="RelaunchYearId" class="text-danger"></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@if (Model.RenewalColumns != null)
{
@for (var i = 0; i < Model.RenewalColumns.Count; i++)
{
<input type="hidden" asp-for="@Model.RenewalColumns[i].ClientId" />
<input type="hidden" asp-for="@Model.RenewalColumns[i].ClientName" />
<input type="hidden" asp-for="@Model.RenewalColumns[i].FileName" />
<input type="hidden" asp-for="@Model.RenewalColumns[i].FileCode" />
}
}
@*Filter*@
<div class="card-body py-0">
<div class="form-row">
<div class="form-group col-sm-4 col-md-3 col-lg-2">
<label asp-for="ClientCodeFilter"></label>
<input type="text" asp-for="ClientCodeFilter" class="form-control" placeholder="optionnel" maxlength="10">
</div>
<div class="form-group col-sm-4 col-md-3 col-lg-2">
<label asp-for="DeadlineFilter"></label>
<input type="date" asp-for="DeadlineFilter" class="form-control" min="2020-01-01" max="2050-12-31" placeholder="AAAA-MM-JJ" pattern="[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])" maxlenght="10">
<div class="invalid-feedback">
Format : AAAA-MM-JJ
</div>
</div>
<div class="form-group col-sm-6 col-md-4 col-lg-3">
<label asp-for="ShipmentTypeFilter"></label>
<select asp-for="ShipmentTypeFilter" class="custom-select"
asp-items="@Html.GetEnumSelectList<ShipmentType>()">
</select>
</div>
<div class="form-group col-sm-3 col-md-2 col-lg-2">
<label asp-for="YearIdFilter"></label>
<select asp-for="YearIdFilter" class="custom-select" required
asp-items="ViewBag.YearSource">
<option value="">--Option--</option>
</select>
</div>
<div class="col-lg-3 mt-lg-4 pt-lg-2 mb-3">
<button type="submit" class="btn btn-dark">Afficher la liste des clients</button>
</div>
</div>
</div>
</form>
<form class="needs-validation" novalidate method="post" asp-action="Generate" asp-controller="Renewal">
<fieldset disabled="@isPageReadOnly">
<input type="hidden" asp-for="RenewalRelaunch" value="@Model.RenewalRelaunch" />
<input type="hidden" asp-for="RenewalStatus" value="@Model.RenewalStatus" />
<input type="hidden" asp-for="RelaunchYearId" value="@Model.RelaunchYearId" />
<input type="hidden" asp-for="ClientCodeFilter" />
<input type="hidden" asp-for="DeadlineFilter" />
<input type="hidden" asp-for="YearIdFilter" />
<input type="hidden" asp-for="ShipmentTypeFilter" value="@Model.ShipmentTypeFilter" />
<input type="hidden" asp-for="IsContractChecked" />
@*Programs*@
<div class="card-body pt-0">
@if (!_generalOptions.Value.CurrentCompany.Equals("AGROVEL", StringComparison.OrdinalIgnoreCase))
{
<div class="card mt-3">
<div class="card-header">
Escompte sur les programmes
</div>
<div class="card-body">
<div class="form-row row-cols-1 row-cols-sm-2 rows-cols-md-4 row-cols-lg-6">
<div class="form-group custom-control custom-checkbox col text-center">
<label asp-for="ProfessionnelDiscount"></label>
<div class="input-group has-validation">
<input asp-for="ProfessionnelDiscount" class="form-control form--control--solid text-right" pattern="\d+([,]\d{2})?" maxlength="6">
<div class="input-group-append">
<div class="input-group-text">$</div>
</div>
<div class="invalid-feedback">
<span asp-validation-for="ProfessionnelDiscount" class="text-danger"></span>
</div>
</div>
</div>
<div class="form-group custom-control custom-checkbox col text-center">
<label asp-for="DiamantDiscount"></label>
<div class="input-group has-validation">
<input asp-for="DiamantDiscount" class="form-control form--control--solid text-right" pattern="\d+([,]\d{2})?" maxlength="6">
<div class="input-group-append">
<div class="input-group-text">$</div>
</div>
<div class="invalid-feedback">
<span asp-validation-for="DiamantDiscount" class="text-danger"></span>
</div>
</div>
</div>
<div class="form-group custom-control custom-checkbox col text-center">
<label asp-for="DeluxeDiscount"></label>
<div class="input-group has-validation">
<input asp-for="DeluxeDiscount" class="form-control form--control--solid text-right" pattern="\d+([,]\d{2})?" maxlength="6">
<div class="input-group-append">
<div class="input-group-text">$</div>
</div>
<div class="invalid-feedback">
<span asp-validation-for="DeluxeDiscount" class="text-danger"></span>
</div>
</div>
</div>
<div class="form-group custom-control custom-checkbox col text-center">
<label asp-for="PrestigeDiscount"></label>
<div class="input-group has-validation">
<input asp-for="PrestigeDiscount" class="form-control form--control--solid text-right" pattern="\d+([,]\d{2})?" maxlength="6">
<div class="input-group-append">
<div class="input-group-text">$</div>
</div>
<div class="invalid-feedback">
<span asp-validation-for="PrestigeDiscount" class="text-danger"></span>
</div>
</div>
</div>
</div>
</div>
</div>
}
@if (Model.RenewalColumns != null)
{
@for (var i = 0; i < Model.RenewalColumns.Count; i++)
{
<input type="hidden" asp-for="@Model.RenewalColumns[i].ClientId" />
<input type="hidden" asp-for="@Model.RenewalColumns[i].ClientName" />
<input type="hidden" asp-for="@Model.RenewalColumns[i].FileName" />
<input type="hidden" asp-for="@Model.RenewalColumns[i].FileCode" />
<input type="hidden" asp-for="@Model.RenewalColumns[i].FileId" />
}
}
<div class="row mt-3 mb-4">
<div class="col text-left text-lg-right">
<button type="submit" class="btn btn-primary mb-2 mb-md-0" name="submit" value="generate">Générer l'envoi</button>
<button type="submit" class="btn btn-primary mb-2 mb-md-0" name="submit" value="print">Imprimer les cartons</button>
</div>
</div>
</div>
</fieldset>
</form>
<div class="card-body">
<div class="table-responsive">
<table class="table custom--datatable table-striped border-bottom">
<thead>
<tr>
<th style="width:330px;">Client</th>
<th style="width:330px;">Code Client</th>
<th style="width:330px;">Dossier</th>
<th class="w-auto">Code dossier</th>
</tr>
</thead>
<tbody>
@if (Model.RenewalColumns == null || !Model.RenewalColumns.Any())
{
<tr class="empty--row">
<td colspan="3">Aucune donnée à afficher</td>
</tr>
}
else
{
foreach (var column in Model.RenewalColumns)
{
<tr>
<td class="text-nowrap">@Html.DisplayFor(_ => column.ClientName)</td>
<td class="text-nowrap">@Html.DisplayFor(_ => column.ClientCode)</td>
<td class="text-nowrap">@Html.DisplayFor(_ => column.FileName)</td>
<td class="text-nowrap">@Html.DisplayFor(_ => column.FileCode)</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
@*Modal add/edit/delete*@
<div id="PlaceHolderElement"></div>
@if (Model.SuccessMessage.IsNotNullOrWhiteSpace())
{
<div id="Snackbar" class="snackbar-success">
<div class="alert alert-success">
class="far fa-2x fa-check-circle d-block mb-3">
@Model.SuccessMessage
</div>
</div>
}
else if (Model.ErrorMessage.IsNotNullOrWhiteSpace())
{
<div id="Snackbar" class="snackbar-error">
<div class="alert alert-danger alert-dismissible fade show">
<button type="button" class="close" data-dismiss="alert">
<span aria-hidden="true">×</span>
</button>
^__i class="fas fa-2x fa-exclamation-circle d-block my-3">
@Model.ErrorMessage
</div>
</div>
}
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script>
$("#CheckRenewal").click(function () {
$("#RelaunchYearId").val(null);
$("#RelaunchYearId").prop('disabled', true);
$("#CheckNotRenewed").prop('disabled', false);
$("#CheckRenewedUnpaid").prop('disabled', false);
})
$("#CheckRelaunch").click(function () {
$("#CheckNotRenewed").prop('checked', false);
$("#CheckRenewedUnpaid").prop('checked', false);
$("#CheckNotRenewed").prop('disabled', true);
$("#CheckRenewedUnpaid").prop('disabled', true);
$("#RelaunchYearId").prop('disabled', false);
})
</script>
}
Controller code:
[Authorize(Policy = AuthorizationPolicies.RenewalResidential_TotalAccess)]
public class RenewalController : Controller
{
private const string ListTempDataKey = "RenewalController.Liste";
private readonly IRenewalPresentationService _renewalPresentationService;
private readonly IYearPresentationService _yearPresentationService;
public RenewalController(IRenewalPresentationService renewalPresentationService,
IYearPresentationService yearPresentationService)
{
_renewalPresentationService = renewalPresentationService;
_yearPresentationService = yearPresentationService;
}
private async Task SetDropdownYearAsync(CancellationToken ct)
{
this.SetDropDownFromPropertyOfSource
(
"YearSource",
await _yearPresentationService.SetDropdownYearAsync(ct),
s => s.Id,
s => s.Value
);
}
public async Task<ActionResult> Liste([FromQuery] ListRenewalViewModel listRenewalViewModel, CancellationToken ct)
{
var tempData = TempData.Get<ListRenewalViewModel>(ListTempDataKey);
if (tempData != null)
{
listRenewalViewModel = tempData;
}
await SetDropdownYearAsync(ct);
return View("List", await _renewalPresentationService.ReadRenewalListAsync(listRenewalViewModel, ct));
}
[HttpPost]
public async Task<ActionResult> Filter(ListRenewalViewModel listRenewalViewModel, CancellationToken ct)
{
if (!ModelState.IsValid)
{
await SetDropdownYearAsync(ct);
return View("List", listRenewalViewModel);
}
return RedirectToAction("Liste", listRenewalViewModel);
}
[Authorize(Policy = AuthorizationPolicies.RenewalResidential_EditAccess)]
[HttpPost]
public async Task<ActionResult> Generate(ListRenewalViewModel listRenewalViewModel, string submit, CancellationToken ct)
{
if (!ModelState.IsValid)
{
await SetDropdownYearAsync(ct);
return View("List", listRenewalViewModel);
}
if (submit.ToLower() == "generate")
{
var listRenewal = await _renewalPresentationService.GenerateShipmentAsync(listRenewalViewModel, ct);
TempData.Put(ListTempDataKey, listRenewal);
switch (listRenewalViewModel.ShipmentTypeFilter)
{
case ShipmentType.All:
case ShipmentType.CustomersByPost:
return RedirectToAction("RenewReportIndex", "Report",
new RenewReportViewModel
{
RenewReportType = RenewReportType.RenewReport,
RenewIds = await _renewalPresentationService.ReadRenewIdsForReportAsync(listRenewalViewModel, ct)
});
default:
break;
}
}
else
{
return RedirectToAction("RenewReportIndex", "Report",
new RenewReportViewModel
{
RenewReportType = RenewReportType.CardRenewReport,
RenewIds = await _renewalPresentationService.ReadRenewIdsForReportAsync(listRenewalViewModel, ct)
});
}
return RedirectToAction("Liste");
}
}
What I have tried:
I check the code, didn't find the problem.