2016-12-14 62 views
1

我在Visual Studio 2015中使用ASP.NET MVC。該應用程序具有以下結構:ASP.NET MVC路由從部分視圖返回用戶到原點

  • MyApp的

    • 控制器

      • 控制器1
        • 操作
          • 鉻eate
          • 刪除
          • 詳細
          • 編輯
          • IndexPartial
      • 控制器2
        • 操作
          • 編輯
      • Controller3
        • 操作
          • 編輯
    • 查看

      • 控制器1
        • 創建
        • 刪除
        • 詳細
        • 編輯
        • IndexPartial
      • 控制器2
        • 編輯
      • Controller3
        • 編輯

該應用程序顯示Controller1/IndexPartial視圖上Controller2/Edit視圖和。該局部視圖顯示數據行,每個數據行都帶有Edit,Details,Delete按鈕,這些按鈕可讓用戶訪問Controller1視圖來執行這些操作。

當用戶與控制器1的動作完成後,他們需要通過Back to List按鈕或當保存/刪除按鈕被點擊返回Controller2/Edit或。但是,我們如何確定用戶來自哪裏?用戶是否來自Controller2EditController3

我們想過使用會話變量。可以使用RouteConfig.cs來跟蹤用戶的路徑並幫助確定他/她應該返回的位置嗎?我們如何通過MVC中的路由來做到這一點?

謝謝你的幫助。

更新:這一切都通過服務器完成;沒有JavaScript(Angular等)。

+1

不要爲此類事情使用會話變量。如果會話超時(無論出於何種原因且有很多),表單將會中斷。相反,只需在URI中傳遞一個指示返回頁面的參數即可。 –

+0

@ JennyO'Reilly,謝謝。該參數是否需要更改路線?你是否介意在一個例子中回答這個問題? – Alex

+1

我不會把它放在路線上,因爲它會使這些不必要的複雜。您可以簡單地將一個值(POST或GET)傳遞給被調用的端點(無論路由),並使用Request對象在Action方法中檢查它。也許可以把這個檢查包裝在一個輔助對象/方法中,這樣你就不必每次硬編碼值的名字。 –

回答

3

路由引擎與您所需要的無關。你需要跟蹤用戶導航,一個很好的方法是使用ActionFilters。

您可以創建一個自定義的ActionFilter來檢查其OnActionExecuted上的UrlReferrer,並決定如何將請求重定向到適當的Controller/Action。

[例]

ActionFilter

public class RedirectAfterActionFilter : ActionFilterAttribute, IActionFilter 
{ 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     // Your decision logic 
     if (filterContext.HttpContext.Request.UrlReferrer.AbsolutePath == "something usefull") 
     { 
      filterContext.Result = new RedirectToRouteResult("Your Route Name", routeValues: null); // redirect to Home 
     } 

     base.OnActionExecuted(filterContext); 
    } 
} 

ActionFilter使用

[RedirectAfterActionFilter] 
    public ActionResult DoSomethingAndGetRedirected() 
    { 
     // Save, Edit or Whatever 
     //... 

     return new EmptyResult(); // no need to return since the user will be redirected by the filter 
    } 

外:如果你不喜歡使用路由名稱重定向閱讀How to redirect from a action filter

+0

謝謝,@DouglasGandini。你能指出我的一個例子嗎?一些代碼總是幫助:) – Alex

+1

當然!我編輯了我的答案並添加了一些示例代碼。 –

+0

再次感謝@DouglasGandini。跟進:上述技術是否也可用於在編輯視圖中設置「ActionLink」上的值,以便知道「返回列表」按鈕的位置? – Alex

3

有兩個方面是:

  • 的「返回列表」鏈接
  • 「保存/刪除」行動

至於「返回列表」鏈接,您的控制器應該提供所需的所有信息以生成可行的GUI。將標識符(甚至實際的返回URL)作爲動態屬性傳遞給ViewBag中的視圖,並讓視圖呈現到目標的鏈接。

對於「保存/刪除」操作,取決於它們如何實現。

如果這是所有與http請求的JS,那麼上述相同的概念適用。

但是,如果您要回發到服務器,控制器將必須執行類似RedirectToAction()之類的重定向。

+0

實際上,局部視圖上的「返回列表」現在位於不同的控制器中,因此它不會知道原始控制器。如果我點擊它,它會發送給我'Controller1/Index' – Alex

+1

它在哪裏並不重要,這就是爲什麼它是局部視圖。重要的是,你告訴它它需要指向哪裏,這是控制器知道的,因爲它正在處理原始動作。再次閱讀我的答案,並告訴我是否需要額外的幫助。 – JuanR

+1

順便說一下,請嘗試將您的部分視圖置於中性文件夾中以避免混淆。通常的做法是將它們放置在Views/Shared中。 – JuanR

0

如何在ViewBag存儲以前的位置,然後用ViewBag內容填充你的按鈕的href ...

或者

您可以使用Url Referrer,這fectches前面的網址鏈接到當前頁面。

當然最好的方法將取決於你的實現,沒有看到你的代碼這兩個是我能想到的最佳選擇。

+0

每個控制器不是'ViewBag'還是不同的控制器('Controller1')讀取它?也許我很困惑這將如何工作。 – Alex

+0

我的不好,你是對的Viewbag僅限於控制器,它在一個請求中保存了值。如果您想將數據從一個控制器傳輸到另一個控制器,則需要使用TempData或Session。 你是否直接從Controller1調用Controller2? – iniestar