Grazie, sempre molto gentile è molto competente.
PS
"Come stai persistendo i dati nel db? Entity Framework?" SI
Se posso ti chiedo altri consigli.
Come penso ora sia abbastanza chiaro stò cercando di sviluppare una pagina dove è presente una testata con i filtri da applicare sui dati e una parte con una grid che visualizza il risultato dei filtri.
Nella testata dove ho i filtri utilizzo @Html.DropDownListFor e @Html.TextBoxFor mentre per i risultati ho creato una PartialView con all'interno @Html.Grid.
Nel controller ActionResult Index carico la collezione della ddl del filtro e passo il modello.
In ActionResult SearchResults(DocTeFilterViewModel ModelFilter) eseguò il filtro e ritorno la PartialView.
Quando eseguò il paging della grid oppure un submit viene ricaricata l'intera pagina... viene eseguito ActionResult Index ... come posso fare per aggiornare solo la grid, con le webform utilizzavo gli updatepanel per situazioni di questo genere.
Ho provato ad utilizzare
@*@using (Ajax.BeginForm(
new AjaxOptions
{
InsertionMode = InsertionMode.Replace,
HttpMethod = "POST",
UpdateTargetId = "search-results"
})
)*@
@using (Ajax.BeginForm ma non sono riuscito .. come dovrebbe essere la struttuta della pagina ?
Ciao e ancora grazie in anticipo.
Index.cshtml
@model Portal.Web.ViewModels.DocTeFilterViewModel
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "DocTe", FormMethod.Get))
{
var ModelFilter = Model;
var slRecVs = ViewBag.RecV as SelectList;
<div class="panel-group" id="accordion" style="margin-bottom:0">
<div class="panel panel-info">
<div class="panel-heading">
<div class="btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
<span class="glyphicon glyphicon-filter"></span>
</a>
<button type="submit" class="btn btn-info" aria-label="Right Align">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</div>
</div>
</div>
<div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne">
<div class="panel-body">
<div class="form-horizontal">
<div class="form-group">
<div class="col-sm-3">
@Html.DropDownListFor(m => ModelFilter.Nrec, slRecVs, new { @class = "selectpicker span1 show-menu-arrow" })
</div>
<div class="col-sm-2">
@Html.TextBoxFor(m => ModelFilter.clasdoc, new { autocomplete = "off", placeholder = "classe" })
</div>
<div class="col-sm-2">
@Html.TextBoxFor(m => ModelFilter.tipdoc, new { autocomplete = "off", placeholder = "tipo" })
</div>
<div class="col-sm-2">
@Html.TextBoxFor(m => ModelFilter.descr, new { autocomplete = "off", placeholder = "descrizione" })
</div>
</div>
<div class="form-group">
<div class="col-sm-3">
</div>
<div class="col-sm-2">
@Html.TextBoxFor(m => ModelFilter.reparto, new { autocomplete = "off", placeholder = "reparto" })
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@Html.Action("SearchResults",ModelFilter)
}
SearchResultPartial.cshtml
@model IEnumerable<Portal.Web.ViewModels.DocTeViewModel>
@using GridMvc.Html
<div id="search-results">
@Html.Grid(Model).Columns(columns =>
{
/* Adding not mapped column, that renders body, using inline Razor html helper */
columns.Add()
.Encoded(false)
.Sanitized(false)
.SetWidth(200)
.RenderValueAs(d =>
@<b>
@Html.ActionLink("Edit", "Edit", new { id = d.IDDocTe }) |
@Html.ActionLink("Details", "Details", new { id = d.IDDocTe }) |
@Html.ActionLink("Delete", "Delete", new { id = d.IDDocTe })
</b>);
/* Adding "clasdoc" column: */
columns.Add(m => m.clasdoc)
.Titled("Classe")
.SetWidth(100);
/* Adding "tipdoc" column: */
columns.Add(m => m.tipdoc)
.Titled("Tipo")
.SetWidth(100);
/* Adding "descr" column: */
columns.Add(m => m.descr)
.Titled("Descrizione")
.Filterable(true)
.SetWidth(200);
/* Adding "reparto" column: */
columns.Add(m => m.reparto)
.Titled("Reparto")
.Filterable(true)
.SetWidth(100);
}).WithPaging(3).Sortable(true)
<input type="submit" value="Search" />
</div>
DocTeController.cs
[ChildActionOnly]
public ActionResult SearchResults(DocTeFilterViewModel ModelFilter)
{
try
{
//Espressione del filtro dati
var espressioneFiltro = PredicateBuilder.Create<DocTe>(item => true);
if (!string.IsNullOrWhiteSpace(ModelFilter.descr))
espressioneFiltro = espressioneFiltro.And(c => c.descr.Contains(ModelFilter.descr));
if (!string.IsNullOrWhiteSpace(ModelFilter.clasdoc))
espressioneFiltro = espressioneFiltro.And(c => c.clasdoc.Contains(ModelFilter.clasdoc));
if (!string.IsNullOrWhiteSpace(ModelFilter.tipdoc))
espressioneFiltro = espressioneFiltro.And(c => c.tipdoc.Contains(ModelFilter.tipdoc));
if (!string.IsNullOrWhiteSpace(ModelFilter.reparto))
espressioneFiltro = espressioneFiltro.And(c => c.reparto.Contains(ModelFilter.reparto));
// Poi creo un'istanza del filtro passandogli l'espressione
var filtro = new Filter<DocTe>(espressioneFiltro, ModelFilter.Nrec);
var DocTes = docteService.GetDocTesByFilter(filtro);
var model = Mapper.Map<IEnumerable<DocTe>, IEnumerable<DocTeViewModel>>(DocTes);
return PartialView("SearchResultsPartial", model);
}
catch (Exception e)
{
ModelState.AddModelError("",String.Format("Unable to search. Try again, and if the problem persists see your system administrator.", e.Message));
}
return PartialView("Error");
}
// GET: DocTe
[HttpGet]
public ActionResult Index(DocTeFilterViewModel ModelFilter)
{
//Set Collections
ViewBag.RecV = utils.GetRecVSelectList();
return View(ModelFilter);
}