从MVC4中的不同视图或控制器重定向到上一个视图?

时间:2013-03-18 19:55:05

标签: asp.net-mvc asp.net-mvc-4

我从用户级别和员工级别获得相同的视图。当用户登录应用程序时,他会看到他的活动,并从Create视图创建新活动。来自员工,他们将搜索用户并查看用户的信息,然后在同一Create视图中代表用户创建新活动。

棘手就在这里,两个人都会看到Create视图。当他们取消并保存时,他们必须返回上一页。

如何处理?

ex:
http://localhost/members/listActivities - for members
http://localhost/staff/memberinfo

To 

http://localhost/members/create

2 个答案:

答案 0 :(得分:2)

对于“取消”操作,您可以完全跳过服务器端参与,并使用JavaScript将浏览器定向到以前的位置。 (这有额外的好处是支持将来从另一个地方来到那里的任何人。)像这样:

<input type="button" value="Cancel" id="cancelButton" />
<!-- and later... -->
<script type="text/javascript">
    $('#cancelButton').click(function () {
        window.history.back();
    });
</script>

对于“保存”操作,您是否可以在服务器上识别出他们所使用的“类型”用户并相应地指导他们?如果没有,也许您需要在创建操作首先响应视图时跟踪它们的来源。也许该动作可以接受重定向作为参数?像这样:

public ActionResult Create(string redirectUrl)

然后,您可以将该参数添加到“创建”视图模型,将其存储在隐藏字段或具有该性质的某些内容中。当您在保存时回发到创建操作时,您将在该参数集中再次包含它并将其用于重定向(当然,如果它是空的,则默认为特定页面)。

然后,只要您有@Html.ActionLinkCreate,就会将redirectUrl作为路线值。

修改为了完整性,正如Oliver在下面的评论中所提到的,您可以尝试通过Request.UrlReferrer识别控制器操作中的上一页。这将用于Create的非帖子调用,以自动填充将在后调用中返回的隐藏字段。 (因为在帖子调用中,引用者是页面本身,因此没有用处。)请记住这里有两个主要内容:

  1. 浏览器控制引荐来源,你没有。有些浏览器可能会发送错误的引用,或者更常见的是,根本没有引用。它可能会在10次中工作9次,但可能不会。但是,为了完整性,它可以用作后备来捕获您(或其他开发人员)未明确包含redirectUrl作为路由值的情况。
  2. 这将控制器耦合到HTTP上下文。这可能永远不会成为您的需求的问题,但它首先打破的是对该动作方法的单元测试。除非绝对必要,否则最好避免这种耦合,并且在使用它时确切地知道你正在做什么。

答案 1 :(得分:0)

你可以在你的UserViewModel中添加一个名为IsStaff的属性。它将是一个布尔值。对于职员用户来说这是真的,否则它将是假的。然后在做你的创建功能之后你将得到你当前用户的IsStaff值和在if条件下检查它并将它们重定向到不同的行为。

public bool IsStaff{get;set;}

对于Create:

public ActionResult Create()
{
    ...//do creation here
    if(UserRepository.GetUserByUsername(User.Identity.Name).IsStaff==true)
        return RedirectToAction("staff","memberinfo");
    else
        return RedirectToAction("members","listActivities");
    return View();
}