sulla mia pagina ho:modello è nullo dopo il postback nel pager
- una sezione 'filtro' - un paio di caselle di controllo e caselle di testo,
- un tasto 'cerca',
- griglia con paginazione dove vengono visualizzati i risultati. La griglia proviene da Telerik (http://demos.telerik.com/aspnet-mvc/grid/index1), ma non credo che questo sia importante.
Ricerca in corso OK - È possibile immettere del testo o selezionare una casella di controllo nella sezione del filtro per visualizzare i risultati appropriati.
Il cercapersone funziona correttamente solo se lo utilizzo quando la pagina viene caricata (ciò significa che prima di fare clic sul pulsante Cerca, in questo caso l'url è '... Casa').
Ma se si fa prima clic su Cerca (in questo caso l'url diventerà '... Home/Cerca') e poi si proverà ad andare su un'altra pagina sulla griglia, allora ottengo un'eccezione nel metodo di ricerca, perché il modello Il parametro .Filter è null (System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto.)
Ho provato a risolvere il problema in molti modi diversi (con il metodo RedirectToAction, archiviando il filtro in sessione e utilizzandolo in Metodo di ricerca, ...) ma nessuna soluzione ha funzionato in tutti gli scenari. Qualche idea?
Il mio codice semplificato:
HomeController:
public ActionResult Index()
{
// On page load display all data without filters.
var filter = new OverviewFilterModel
{
Type1 = true,
Type2 = true,
WorkingOrder = ""
};
ViewBag.Results = GetResults(filter);
return View(new HomeModel { Filter = filter });
}
public ActionResult Search(HomeModel model)
{
ViewBag.Results = GetResults(model.Filter);
return View("Index");
}
public class OverviewFilterModel
{
public bool Type1 { get; set; }
public bool Type2 { get; set; }
public string WorkingOrder { get; set; }
}
public class HomeModel
{
public OverviewFilterModel Filter { get; set; }
public IEnumerable<OverviewResultsModel> Results { get; set; }
}
Vista:
<!-- ... -->
@model HomeModel
<!-- ... -->
@using (Html.BeginForm("Search", "Home", FormMethod.Post, new { @class = "form-inline" }))
{
<div class="form-group" style="margin-left: 135px;">
@Html.CheckBoxFor(p => p.Filter.Type1)@Html.LabelFor(p => p.Filter.Type1, new { style = "margin: 0 15px 0 5px;" })
</div>
<!-- a bunch of other checkboxes -->
<br />
<div class="form-group">
<label style="width: 130px; text-align: right;">Delovni nalog</label>
@Html.TextBoxFor(p => p.Filter.WorkingOrder, new { @class = "form-control ecert-filter-small", @autocomplete = "off" })
</div>
<!-- a bunch of other textboxes -->
<button class="k-button" id="button-refresh" style="margin: 10px 0 0 135px;">Refresh</button>
<hr />
@(Html.Kendo().Grid<OverviewResultsModel>()
.BindTo((IEnumerable<OverviewResultsModel>)ViewBag.Results)
.Name("gridOverview")
.Events(p => p.Change("overviewOnRowSelect"))
.Columns(columns =>
{
columns.Template(@<text>@Html.ActionLink("WorkingOrder", "Index", "WO", new { dn = @item.WorkingOrder }, new { @class = "selectable-dn" })</text>).Title("");
columns.Bound(p => p.Type);
columns.Bound(p => p.WorkingOrder);
columns.Bound(p => p.Date);
columns.Bound(p => p.ProductId);
columns.Bound(p => p.ProductName);
})
.Selectable()
.Pageable(p => p
.Refresh(true)
.PageSizes(true)
.ButtonCount(10)
.Messages(q =>
{
q.Display("{0} - {1} od {2} records");
q.Empty("No data for selected filter");
q.ItemsPerPage("Number of records per page");
})
)
.DataSource(p => p.Server().PageSize(20).Model(q => { q.Id(r => r.WorkingOrder); }))
)
}
Forse dovresti controllare il tuo modello, e se è nullo, gestirlo. Inoltre, non riesco a capire, dov'è la variabile 'filter' definita nel tuo metodo 'Index'? Se è necessario utilizzare alcuni dati tramite un paio di pagine, ti consigliamo di utilizzare 'TempData' invece di' ViewBag'. –
Ho modificato la mia domanda - nel metodo Index (quando la pagina viene caricata) il filtro è vuoto quindi tutti i dati dovrebbero essere visualizzati. Ho anche aggiunto la classe HomeModel che viene utilizzata nella vista (@model HomeModel). – sventevit