すべてのページにA-Zディレクトリの「ウィジェット」があります。ユーザーがホームページを表示していて、ディレクトリ内の何かをクリックした場合、対応する結果がロードされたディレクトリページをロードしたいと思います。しかし、ユーザーがディレクトリページを表示していて何かをクリックした場合は、ページを更新せずに結果を非同期でロードしたいと思います。
ディレクトリウィジェットには、GroupControllerのDirectoryResultアクションメソッドを指すリンクがあります。これらのメソッドは、ディレクトリページにある場合、通常は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のどちらを返す必要があるかを判断するためのより良い方法はありますか?