ASP.Net MVC 4 Razor - просмотр результатов поиска на веб-сетке

1

Я создал страницу поиска, которая возвращает список объектов, которые будут отображаться на веб-странице. Я использую webgrids default paging. Проблема возникает, когда я пытаюсь перейти на вторую страницу результатов поиска - я возвращаюсь на страницу поиска. Как использовать функциональность пейджинга глухого бритвенного webgrid и добиваться пейджинга через результаты поиска?

Actionmethod:

  [HttpPost]
    public ActionResult GetEmails(UserResponse response )
    {
        if (response.RefId != null)
        {
            int refID = Convert.ToInt32(response.RefType);
            var query = from c in db.tb_EmailQueue
                        where c.ReferenceTypeId == refID && c.ReferenceId.Contains(response.RefId)
                        select c;

            var results = new List<tb_EmailQueue>();

            results.AddRange(query);

            return View("Index", results);
        }
      return View();

      }

Просмотр страницы:

    <body>
@using (Html.BeginForm())
         {
           @Html.DropDownListFor(x=> x.RefType, (IEnumerable<SelectListItem>)  ViewBag.Categories,"Please select reference type") 

    <br/>

    <p>Reference Type</p>
    @Html.TextBoxFor(x => x.RefId)
 <input type ="submit" value="Submit" />

}

@using (Html.BeginForm())
{
    @Html.TextBoxFor(x=>x.Date, new{@id="example1"})
    <input type ="submit" value="Submit" />
    <br/>

}

Отображение результатов:

    @{
if (Model.Any())
{
    var grid = new WebGrid(Model, canPage: true, rowsPerPage: 100);


    @grid.GetHtml(tableStyle: "table table-striped table-bordered", columns: grid.Columns(
        grid.Column(header: "EmailQueueId",
                    columnName: "EmailQueueId",
                    format: item => Html.ActionLink(((int) item.EmailQueueId).ToString(), "Details", new {id = item.EmailQueueId})),
        grid.Column("QueueDateTime", canSort: true, format: @<text>@item.QueueDateTime.ToString("dd/MM/yy H:mm:ss")</text>),
        grid.Column("ReferenceTypeID"),
        grid.Column("ReferenceID"),
        grid.Column(header: "ToList",
                    columnName: "ToList",
                    format: @<input type ="text" value="@item.ToList"  title="@item.ToList" readonly="readonly"/>),
        grid.Column(header: "Subject",
                    columnName: "Subject",
                    format: @<input type ="text" value="@item.Subject" title ="@item.Subject" readonly="readonly"/>),
        grid.Column("FailureCount")
                                                                        ))
}

else
{
    <p>No records</p>
}
}
  • 0
    Я раньше не пользовался WebGrid , поэтому постараюсь получить информацию, которую мне здесь не хватает. Когда вы нажимаете «Следующая страница», он вызывает метод GetEmails , правильно? Где-то в вызове метода, он должен посылать, по крайней мере, какой номер страницы вы ищете, и, надеюсь, количество результатов на странице. Вы видите эту информацию?
  • 0
    Веб-сетка отправляет это обратно нормально
Теги:
razor
asp.net-mvc

2 ответа

0

Проблема пейджинга и сортировки с WebGrid отфильтрованным подмножеством таблицы была решена для структуры веб-страниц ASP.NET Майком Бриндом в этой статье: Отображение результатов поиска в WebGrid.

Я попытался перевести его в MVC, но мне больше нравится веб-страницы, поэтому будьте терпимы.

контроллер

public ActionResult Customers(string country)
{
    var search = (country == null ? "" : country);
    NORTHWNDEntities db = new NORTHWNDEntities();
    var query = from c in db.Customers
                where c.Country.Contains(search)
                select c;
    var results = new List<Customers>();
    results.AddRange(query);

    return View("Customers", results);
}

Посмотреть

@{
    var grid = new WebGrid(Model, rowsPerPage:5);
}

<hgroup class="title">
    <h1>Customers</h1>
</hgroup>

<section id="searchForm">
    @using (Html.BeginForm()){
        <p>
            Country: @Html.TextBox("Country", @Request["Country"]) 
            <input type="submit" />
        </p>
    }
</section>
<section>
    <div>
        @grid.GetHtml(columns:grid.Columns(
            grid.Column(columnName:"CompanyName",header:"Name"),
            grid.Column(columnName:"Address"),
            grid.Column(columnName:"City"),
            grid.Column(columnName:"Country")
        ))
    </div>
</section>

@section scripts{
    <script type="text/javascript">
   $(function(){
       $('th a, tfoot a').on('click', function () {
            $('form').attr('action', $(this).attr('href')).submit();
            return false;
        });
    });
    </script>
}

Я использовал образец Northwind db; если вы хотите использовать мой же db, вы можете найти его по этой ссылке.

Решение сохраняет форму поиска и WebGrid на одной странице, так как каждый раз, когда вы изменяете порядок разбивки на страницы или сортировку, вы должны пересканировать критерии поиска для фильтрации таблицы.

Согласно Mike Brind, "Ответ на проблему заключается в фрагменте jQuery, который появляется в разделе сценария. Обработчик привязан к событию onclick ссылок в областях заголовка таблицы и таблицы - или ссылки сортировки и подкачки. Когда они нажимаются, значение ссылки получается и предоставляется атрибуту action form, затем форма представляется с использованием POST, а запрос GET отменяется возвратом false. Это гарантирует, что информация поискового вызова и сортировки сохраняется в Коллекция Request.QueryString, в то время как любые значения поля формы передаются в коллекции Request.Form. "

0

Поскольку вы вернетесь к тому, какой номер страницы запрашивается, и вы знаете, сколько результатов вы ищете, вам просто не хватает части вашего запроса LINQ. Я не использую синтаксис SQL, поэтому, пожалуйста, извините, хотя он должен быть легко переводим на вашу методологию.

var query = (from c in db.tb_EmailQueue
            where c.ReferenceTypeId == refID && c.ReferenceId.Contains(response.RefId)
            select c).Skip((pageNumber - 1) * pageSize).Take(pageSize);

Вы хотите (pageNumber - 1) потому что ваш номер pageNumber будет основан на 1, и если вы ищете первую страницу, вы не хотите пропускать что-либо (0 * pageSize). С этими результатами вы просто хотите Take() однако многие из них будут отображаться на странице.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню