Na stronie internetowej mam tabelę. Obok tabeli jest przycisk "Dodaj nowy rekord". Kliknięcie przycisku powoduje, że do serwera jest wysyłane ajaxowe żądanie:
@Ajax.ActionLink("Dodaj pomiar +", "Add", "Measurement", new AjaxOptions() { UpdateTargetId = "addWeightMeasurementModal" }, new {@data_toggle = "modal", @data_target = "#addWeightMeasurementModal" })
Kontroler zwraca PartialView, który jest kodem html okienka:
[HttpGet]
public ActionResult Add()
{
return PartialView("../Measurement/AddWeightPartial");
}
Teraz pojawia się okienko (modal bootstrapowy) z polami do wpisania danych, a zatwierdzenie przyciskiem powoduje, że kolejne ajaxowe żądanie leci do serwera:
@using (Ajax.BeginForm("Add", "Measurement", new AjaxOptions() { HttpMethod = "POST", UpdateTargetId = "weight-table", OnComplete = "closeModal" }))
{
...
...
...
}
I w kontrolerze odbieram dane, waliduję i wrzucam do bazy danych
[HttpPost]
public ActionResult Add(int id, DateTime MeasurementDate, int value)
{
...
...
...
return RedirectToAction("Index");
}
Jak widać, na końcu jest return RedirectToAction("Index");
a metoda Index
wygląda następująco:
public ActionResult Index(DateTime? ResultsFrom, DateTime? ResultsTo, int? PageNumber)
{
var pageNumber = (PageNumber == null || PageNumber <= 0) ? 1 : (int)PageNumber;
var resultsFrom = (ResultsFrom ?? DateTime.Now.AddMonths(-1));
var resultsTo = (ResultsTo ?? DateTime.Now);
var pageSize = 5;
...
...
...
return (Request.IsAjaxRequest())
? (ActionResult)PartialView("WeightTablePartial", model)
: View(model);
}
To znaczy, że po dodaniu nowego wpisu zmienne ResultsFrom
, ResultsTo
, PageNumber
, będą null
, więc zostaną im przypisane domyślne wartości, więc pobrane z bazy i wklejone do tabeli zostaną dane za inny okres, niż były widoczne przed dodaniem nowego rekordu do tabeli.
Jak najlepiej to ugryźć?
Zamienić
[HttpGet]
public ActionResult Add()
na:
[HttpGet]
public ActionResult Add(SearchCriteriaViewModel searchCriteria)
{
var model = new AddWeightMeasurementViewModel();
model.SearchCriteria = searchCriteria;
return PartialView("../Measurement/AddWeightPartial", model);
}
czy może zapisywać ustawienia wyszukiwania np. w ViewBag
i w momencie jeśli przyszło np. ResultsFrom == null
, a ViewBag.ResultsFrom !=
to po prostu podmieniać ResultsFrom
?