2

I'am using grid.mvc(http://gridmvc.codeplex.com/) for filtering and sorting. Does anybody know how to process the filtered result in an action controller. I'm trying to pass a hidden field via FormCollection, but cause of paging only the visible Values are passed. Or is there any good alternative grid in mvc where you can filter and sort and use the filtered result for an action in and MVCController?

_customersGrid.cshtml

    @using GridMvc.Html
@using GridMvc.Site.Models
@using GridMvc.Sorting
@model GridMvc.Site.Models.Grids.CustomersGrid

@{
    ViewBag.Title = "_CustomersGrid";
}

<h2>_PersonsGrid</h2>
@Html.Grid(Model).Named("customersGrid").Columns(columns =>
    {

        columns.Add(o => o.CustomerID)
            .Encoded(false)
        .Sanitized(false)
        .SetWidth(30)
             .RenderValueAs(o => Html.Hidden("CustomerID", o.CustomerID));

        columns.Add(o => o.CompanyName)
                .Titled("Name")
                .SetWidth(110);

        columns.Add(o => o.Phone)
               .Titled("Phone")
               .SetWidth(250);


    }).WithPaging(15).Sortable().Filterable().WithMultipleFilters()

Index.cshtml

@{
    ViewBag.Title = "Home";
}

    @using (Html.BeginForm(null, null, FormMethod.Post, new { @class = "form-horizontal" }))
{   

<fieldset>
<legend></legend>

        @Html.Action("Grid") @* grid in a partial view *@

          <p>
             @Html.ActionLink("Back", "Index",null,new { @class = "btn", @accesskey="b" }) 
       <button type="submit"  class="btn btn-primary" accesskey="s" ><u>S</u>ave</button>
        </p>


    </fieldset>
}

HomeController Actions

 public ActionResult Index()
        {


            return View();
        }
        [HttpPost]
        public ActionResult Index(  FormCollection form)
        {
            var filterSettings = Session["grid-filters"] as IGridFilterSettings;
            var url = new UriBuilder(Url.Action(null, null, null, Request.Url.Scheme));
            if (filterSettings != null)
                url.Query = GetGridFilterQueryString(filterSettings); //restore grid filter settings


            /* How to get the filtered values from grid insteat from formcollection*/
           var chckedValues = form.GetValues("CustomerId");

            foreach (var id in chckedValues)
            {
                //Do something
                Debug.WriteLine(id);
            };


            ViewBag.ActiveMenuTitle = "Demo";
            return Redirect(url.ToString());
        }

        public ActionResult Grid()
        {
            var repository = new CustomersRepository();
            var grid = new CustomersGrid(repository.GetAll());



            Session["grid-filters"] = grid.Settings.FilterSettings;//store grid filters in the session
            return PartialView("_CustomersGrid", grid);

        }
Mathie
  • 21
  • 1
  • 4

1 Answers1

2

I finally found the way to send only filtered results to controller. The solution is to save the selection to session on the "Shared/_Grid.cshtml" page like this:

@helper RenderGridBody()
{
if (!Model.ItemsToDisplay.Any())
{
<tr class="grid-empty-text">
    <td colspan="@Model.Columns.Count()">
        @Model.EmptyGridText

    </td>
</tr>
}
else
{
    Session["Items"]=Model.ItemsToDisplay;
    foreach (object item in Model.ItemsToDisplay)
    {
<tr class="grid-row @Model.GetRowCssClasses(item)">
    @foreach (IGridColumn column in Model.Columns)
    {
        @column.CellRenderer.Render(column, column.GetCell(item))
    }
</tr>
    }
}
} 

When the Grid.MVC is populated with data, the selection is saved to session that can be used later in the controller when executing an action.

In the controller, you only have to call and cast the variable into the correct type:

public ActionResult MyController()
    {
        var SelectedRows = (List<ModelType>)Session["Items"];

        List<ModelType> listStats = SelectedRows;

        // the rest of the controller code
}

I hope that will be helpful :)

Mohamed Bathaoui
  • 340
  • 1
  • 14