62 messaggi dal 22 ottobre 2012
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);
           
        }
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
sì, usare Ajax.BeginForm è il modo corretto se vuoi inviare un form ed aggiornare solo una porzione di pagina con i risultati.

Devi cercare di capire perché non ha funzionato. Magari non hai referenziato il file javascript dell'unobtrusive ajax. Ripercorri qui i passi necessari ad abilitare Ajax.BeginForm.
http://www.codeproject.com/Articles/429164/Html-BeginForm-vs-Ajax-BeginForm-in-MVC
Eventualmente fai esperimenti in una pagina più semplice, come vedi in quell'articolo.

Inoltre controlla dalla sezione "Rete" o "Network" degli strumenti di sviluppo del browser (tasto F12) quali richieste ajax partono dalla tua pagina verso il server.
Può darsi che la richiesta ajax venga inviata all'action sbagliata. Credo che tu debba postare i dati del form all'ActionResults, che è quella incaricata di generare la tabella dei risultati. Per questo dovresti impostare il percorso opportunamente. Esempio:
@using (Ajax.BeginForm("SearchResults", "NomeDelController",
    new AjaxOptions
    {
        InsertionMode = InsertionMode.Replace,
        HttpMethod = "POST",
        UpdateTargetId = "search-results"
    })
 )

Probabilmente dovrai anche togliere l'attributo [ChildActionOnly] dall'action SearchResults.

ciao,
Moreno

Enjoy learning and just keep making
62 messaggi dal 22 ottobre 2012
Grazie.
Ho modificato la view utilizzando Ajax.BeginForm.
Se dalla grid uso il paging mi ricarica l'intera pagina, in pratica esegue la ActionResult Index e viene modificata l'url aggiungento dei parametri.

URLProtocolloMetodoRisultatoTipoRicevutiTempo impiegatoIniziatoreAttesa&#8206;&#8206;Inizio&#8206;&#8206;Richiesta&#8206;&#8206;Risposta&#8206;&#8206;Cache letta&#8206;&#8206;Spazio&#8206;&#8206;
http://localhost:4333/DocTe?grid-page=2HTTPGET200text/html9,35 KB4.05 sclic00405600263252

Se invece esego il submit del bottone, che per prova ho inserito in SearchResultPartial.cshtml, non viene rifrescata la pagina, mi esegue correttamente solo la ActionResult SearchResults



@model Portal.Web.ViewModels.DocTeFilterViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>

@*@using (Ajax.BeginForm("SearchResult", "DocTe", new RouteValueDictionary {
    { "grid-page", Request.QueryString["grid-page"] } },
    new AjaxOptions*@

@using (Ajax.BeginForm("SearchResults","DocTe",
    new AjaxOptions
    {
        InsertionMode = InsertionMode.Replace,
        HttpMethod = "POST",
        UpdateTargetId = "search-results"
    }))
{
    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>

    <div id="search-results">
        @*@Html.Action("SearchResults", ModelFilter)*@
    </div>
}
1.508 messaggi dal 27 dicembre 2005
Avevoi avuto anche io un problema simile, purtroppo la grid utilizzata non supporta ajax credo e quindi fa un postback completo invece che parziale.
62 messaggi dal 22 ottobre 2012
Grazie, cosa posso utilizzare in alternativa ?
1.508 messaggi dal 27 dicembre 2005
rubinim ha scritto:
Grazie, cosa posso utilizzare in alternativa ?



Prova Webgrid.
62 messaggi dal 22 ottobre 2012
Ciao, un' consiglio. Dal layer UI nel quale recupero HttpContext.Current.User.Identity.Name ( currentUsername) come posso fare per passarlo tra i livelli service -> repository ... fino a :.

 public override int SaveChanges()
        {
            var entities = ChangeTracker.Entries().Where(x => x.Entity is BaseEntity && (x.State == EntityState.Added || x.State == EntityState.Modified));

            var currentUsername = ?????????

            foreach (var entity in entities)
            {
                if (entity.State == EntityState.Added)
                {
                    ((BaseEntity)entity.Entity).dtacre = DateTime.Now;
                    ((BaseEntity)entity.Entity).opercre = currentUsername;
                }

                ((BaseEntity)entity.Entity).dtavar = DateTime.Now;
                ((BaseEntity)entity.Entity).opervar = currentUsername;
            }

            return base.SaveChanges();
        }

public override int SaveChanges() per 

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.