Я использую 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);
}
Заранее спасибо.