【问题标题】:grid.mvc use filtered Result in Controllergrid.mvc 在控制器中使用过滤结果
【发布时间】:2014-07-11 10:51:35
【问题描述】:

我正在使用 grid.mvc(http://gridmvc.codeplex.com/) 进行过滤和排序。有谁知道如何在动作控制器中处理过滤结果。我正在尝试通过 FormCollection 传递隐藏字段,但由于分页仅传递了可见值。或者在 mvc 中是否有任何好的替代网格,您可以在其中过滤和排序并将过滤后的结果用于 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 动作

 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);

        }

【问题讨论】:

  • 你能从你的视图中用网格显示一些代码吗?
  • 你有一个包含可见和不可见项目的视图模型吗?

标签: c# asp.net-mvc asp.net-mvc-4 datagrid


【解决方案1】:

我终于找到了只向控制器发送过滤结果的方法。 解决方案是将选择保存到“Shared/_Grid.cshtml”页面上的会话,如下所示:

@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>
    }
}
} 

当 Grid.MVC 填充数据时,选择将保存到会话中,以便稍后在执行操作时在控制器中使用。

在控制器中,您只需调用并将变量转换为正确的类型:

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

        List<ModelType> listStats = SelectedRows;

        // the rest of the controller code
}

我希望这会有所帮助:)

【讨论】:

  • 它只保存当前页面数据,而不是所有记录:(
猜你喜欢
  • 2015-08-30
  • 2014-12-30
  • 2013-10-20
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多