0

すべてのページに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のどちらを返す必要があるかを判断するためのより良い方法はありますか?

4

2 に答える 2

2

このスパゲッティコードをすべて回避するためにビューを確実に改善できますが(エディター/表示テンプレートとHTMLヘルパーを使用し、ビューにアルファベットをハードコーディングしないようにします:-))、アクションメソッドは私には問題ないようです。Request.IsAjaxRequestアクションがAJAXで要求されているかどうかを判断し、部分的なビューを返すか、リダイレクトしない場合は完全に問題ありません。

ハックと見なすことができるのはTempData、ユーザーがリダイレクトされたページを押すF5とコンテキストが失われるため、クエリ文字列を使用する代わりにを使用することですが、これが期待どおりの動作である場合は問題ありません。

私は文脈に精通していませんが、あなたのオフィスの人たちがこれがハックであるという彼らの反応を支持するために使用した議論に興味があります。

于 2010-09-04T12:28:11.340 に答える
1

ダリンは100%正確であり、コードはハックではありませんが、私は通常、名前と署名が異なる2つのアクションを作成することを好みます。これは、次のようなAjaxOnlyアクションフィルターを使用する場合に特に簡単です。http: //helios.ca/2009/05/27/aspnet-mvc-action-filter-ajax-only-attribute/

public ActionResult DirectoryResult(string search)
{        
        var groups = _groupService.GetGroupsBySearchExpression(search);
        var premiumGroups = _groupService.FilterPremiumGroups(groups);

        return PartialView(new FundDirectoryViewModel
        {
            Groups = groups,
            PremiumGroups = premiumGroups
        });        
}

//optional [AjaxOnly]
public ActionResult DirectoryAjaxResult( string search )
{
        TempData[UIMessageDataKeys.FundDirectorySearch] = search;
        return RedirectToAction("Directory", "Group");
}
于 2010-09-04T13:16:37.317 に答える