У меня есть директория A - Z, которая есть на каждой странице. Если пользователь находится на домашней странице и щелкает что-то в каталоге, я хочу загрузить страницу каталога с соответствующим загруженным результатом. Но если пользователь находится на странице каталога и что-то щелкает, я хочу асинхронно загрузить результат без обновления страницы.
Виджет каталога имеет ссылки, которые указывают на метод действия DirectoryResult на GroupController, который обычно возвращает PartialView, если он находится на странице каталога. Но если их нет на странице каталога, я перенаправляю на основной метод действия Каталога, который возвращает представление и загружает всю страницу.
Это код вопроса:
public ActionResult DirectoryResult(string search)
{
if (Request.IsAjaxRequest())
{
var groups = _groupService.GetGroupsBySearchExpression(search);
var premiumGroups = _groupService.FilterPremiumGroups(groups);
return PartialView(new FundDirectoryViewModel
{
Groups = groups,
PremiumGroups = premiumGroups
});
}
else
{
TempData[UIMessageDataKeys.FundDirectorySearch] = search;
return RedirectToAction("Directory", "Group");
}
}
Я показал это одному из парней в офисе, и его немедленным ответом было «это взлом!». Я не знаю, соглашаться с ним или нет, потому что я не знаю лучшего способа сделать это.
Для справки, это определение виджета, который существует на каждой странице:
<div id="DirectoryList" class="directory-list">
<span>Fund Directory</span>
<% var letters = new [] { "A", "B", "C", "D", "E", "F", "G", "H", "I", ... }; %>
<% var current = (Model.Search.IsNotNullOrEmpty()) ? Model.Search : "A"; %>
<% foreach (var letter in letters) { %>
<span>
// use HtmlHelper extension to generate links as our system needs them
<%= Html.RouteActionLink("funddirectory", "DirectoryResult"
, letter
, (letter.ToLower() == current) ? new { @class = "active" } : new { @class = "" })%>
</span>
<%} %>
</div>
Есть ли лучший способ для меня определить, должен ли я возвращать PartialView или View в зависимости от страницы, с которой поступил запрос?