Очистка предыдущих параметров GET (параметров строки запроса) при повторном получении GET - PullRequest
1 голос
/ 02 июня 2011

Я использую MVC3, C #, Razor. У меня есть представление (Index.cshtml), которое включает в себя ссылку на частичное (List.cshtml). На странице также есть форма Ajax (Ajax.BeginForm ...), которая является фильтром для списка. Я использовал метод POST по умолчанию для формы Ajax, и все прекрасно работает. Однако одна вещь не работает, как ожидает мой клиент. Когда я фильтрую список, затем нажимаю на элемент, чтобы просмотреть его детали (Detail.cshtml), а затем нажимаю назад, он не показывает мне отфильтрованный список, а возвращает весь список. Поэтому я хотел бы изменить свой метод формы на GET, чтобы исправить это (а также дать мне возможность напрямую связать человека с отфильтрованным списком). Я делаю это, но это вводит новую аномалию. Я фильтрую свой список, затем выбираю элемент для детализации, затем нажимаю назад. Теперь я получаю отфильтрованный список (по желанию), но также получаю строку запроса в URL, которая переопределяет любые последующие попытки отфильтровать список. Я не уверен, нужно ли мне вручную очищать строку запроса или мне нужно использовать новую схему вообще. Вот соответствующий код:


Index.cshtml

...

    @using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "resultslist", LoadingElementId="loadingResults", OnComplete = "initializePage", HttpMethod="Get" }))
{ 
    <div class="pane">Filter</div>
    <div>
        <div class="filterfield">
            <div class="field">@Html.TextBox("keywords", "")</div>
            <div class="fieldname">Keywords</div>
        </div>
        <div class="filterfield">
            <div class="field">@Html.DropDownList("type", Model.Types, "")</div>
            <div class="fieldname">Type</div>
        </div>
        <div class="filterfield">
            <div class="field">@Html.DropDownList("category", Model.Categories, "")</div>
            <div class="fieldname">Category</div>
        </div>
        <div class="filterfield">
            <div class="field">@Html.DropDownList("subcategory", Model.Subcategories, "")</div>
            <div class="fieldname">Subcategory</div>
        </div>
        <div class="filterfield">
            <div class="field">@Html.Editor("capability","AutocompleteSingle", new { Id = "capability", Url = "/dp/api/pages/GetCapabilities" })</div>
            <div class="fieldname">Capability</div>
        </div>
        <input id="filterButton" type="submit" value="Filter" />
        <input type="button" onclick="$('form').clearForm();filterButton.click();" value="Clear" />
        <div style="clear:both;"></div>
    </div>
}
...
<div id="loadingResults" class="loading">
    loading...
</div>
<div id="resultslist">
    @Html.Partial("List", Model.Pages)
    @if(!ViewBag.Cached) {
        @:Building environments. Please wait. This may take a while.
    }
</div>

PagesController.cs - Индекс Действие

        public ActionResult Index(string keywords, string category, string subcategory, string capability)
    {
        var pages = (CurrentEnvironment != null ? CurrentEnvironment.Pages.AsEnumerable() : new List<CustomPage>());

        //apply filters if they exist
        if (!string.IsNullOrEmpty(keywords))
            pages = pages.Where(
                page => page.Name.ToLower().Contains(keywords.ToLower()) ||
                    page.Category.ToLower().Contains(keywords.ToLower()) ||
                    page.Subcategory.ToLower().Contains(keywords.ToLower()) ||
                    page.Capabilities.Any(name => name.ToLower().Contains(keywords.ToLower())) ||
                    page.File.FullName.ToLower().Contains(keywords.ToLower()) ||
                    page.RevisionHistory.ToLower().Contains(keywords.ToLower()) ||
                    page.Summary.ToLower().Contains(keywords.ToLower())
            );
        if (!string.IsNullOrEmpty(category)) pages = pages.Where(p => p.Capabilities.Count > 0 && p.Category == category);
        if (!string.IsNullOrEmpty(subcategory)) pages = pages.Where(p => p.Capabilities.Count > 0 && p.Subcategory == subcategory);
        if (!string.IsNullOrEmpty(capability)) pages = pages.Where(p => p.Capabilities.Count > 0 && p.Capabilities.Any(c => c.ToLower().Contains(capability.ToLower())));

        //build a view model
        var result = new dp.ViewModels.PagesViewModel
        {
            Pages = pages.ToList(),
            Types = pages.Select(p => p.Type).Where(t => !string.IsNullOrWhiteSpace(t)).Distinct().OrderBy(t => t).ToSelectItemList(t => t, t => t),
            Categories = pages.Select(p => p.Category).Where(c => !string.IsNullOrWhiteSpace(c)).Distinct().OrderBy(c => c).ToSelectItemList(c => c, c => c),
            Subcategories = pages.Select(p => p.Subcategory).Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().OrderBy(c => c).ToSelectItemList(s => s, s => s)
        };

        if (!Request.IsAjaxRequest())
            return View(result);
        else
            return PartialView("List", result.Pages);
    }

Заранее спасибо.

1 Ответ

0 голосов
/ 02 июня 2011

Рассматривали ли вы использование отдельного механизма для поддержания состояния списка / сортировки?Может быть, файлы cookie, которые поддерживаются и загружаются через JavaScript, или, возможно, пользовательский механизм для хранения состояния «управления» через скрытые поля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...