2016-12-14 63 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