2010-09-04 39 views
0

我有一個A - Z目錄'小部件',我在每一頁上。如果用戶在主頁上,他們點擊目錄中的某些內容,我想加載目錄頁面,並加載相應的結果。但是,如果用戶在目錄頁面上,並且他們點擊了某些內容,我想異步加載結果而不進行頁面刷新。這是一個'黑客',如果是的話是否有更好的方法來確定返回哪個ActionResult?

目錄窗口小部件具有指向GroupController上的DirectoryResult操作方法的鏈接,如果它們位於目錄頁面上,它通常會返回一個PartialView。但是,如果它們不在目錄頁面上,我將重定向到主目錄操作方法,該方法返回一個View並加載整個頁面。

這是有問題的代碼:「這是一個黑客」

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或根據在頁面上查看一個更好的方式請求來自?

+1

這不是黑客攻擊的。 – 2010-09-04 12:30:26

回答

2

雖然您的視圖可以絕對改進以避免所有這些意大利麪代碼(使用編輯器/顯示模板和HTML助手,並避免在視圖中對字母進行硬編碼:-)),但操作方法對我來說似乎很好。使用Request.IsAjaxRequest來確定動作是否已通過AJAX請求並返回部分視圖,或者如果沒有重定向,則完全正常。

什麼可被視爲一個黑客是TempData的使用,而不是使用的查詢字符串,因爲如果用戶按下重定向的頁面上F5他會鬆動的背景下,但如果是這樣的行爲,你再期望它的好。

雖然我不熟悉上下文,但我會對你們辦公室裏的人們支持他們這種反應的論點感興趣。

+1

+1格式化'F5'作爲鍵 – 2010-09-04 12:34:36

+0

@SimpleCoder,這是+1我曾經得到的最有趣的理由:-) – 2010-09-04 12:35:47

+0

:)我很高興。我從來沒有見過這裏使用過的標籤。 – 2010-09-04 12:40:16

1

儘管Darin 100%正確,並且您的代碼不是黑客,但我通常更喜歡使用不同名稱和簽名進行兩次操作。這是特別容易,如果你使用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"); 
} 
相關問題