Asp.net mvc 是否从MVC4中的不同视图或控制器重定向到上一个视图?

Asp.net mvc 是否从MVC4中的不同视图或控制器重定向到上一个视图?,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我从用户级别和员工级别都有相同的观点。当用户登录到应用程序时,他会看到自己的活动,并从Create视图创建新活动。员工将搜索用户并查看用户信息,然后在相同的Create视图中代表用户创建新活动 棘手的是,两者都进入不同的视图来查看Createview。当他们取消并保存时,他们必须返回上一页 如何处理 ex: http://localhost/members/listActivities - for members http://localhost/staff/memberinfo To h

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

棘手的是,两者都进入不同的视图来查看
Create
view。当他们取消并保存时,他们必须返回上一页

如何处理

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

To 

http://localhost/members/create
对于“取消”操作,您可以完全跳过服务器端的参与,并使用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)
然后可以将该参数添加到创建视图模型中,将其存储在隐藏字段或类似的内容中。当您在save上发回Create操作时,您将再次将其包含在该参数集中,并将其用于重定向(当然,如果为空,则默认为特定页面)

然后,每当您有一个
@Html.ActionLink
Create
时,您都会包含一个
重定向URL
作为路由值

编辑:为了完整起见,正如Oliver在下面的评论中提到的,您可以尝试通过
Request.urlreferer
来识别控制器操作中的上一页。这将在对
Create
的非post调用中使用,以自动填充post调用中返回的隐藏字段。(因为在post call中,推荐人是页面本身,所以这不会有帮助。)不过,请记住这里的两个要点:

  • 浏览器可以控制推荐人,而你不能。一些浏览器可能会发送不好的参考,或者更常见的是,根本没有。10次中可能有9次有效,但可能没有。但是,同样出于完整性的考虑,它可以用作回退,以捕获您(或其他开发人员)没有明确将
    重定向URL
    作为路由值的情况
  • 这将控制器耦合到HTTP上下文。对于您的需求来说,这可能永远都不是问题,但它首先破坏的是对该操作方法的单元测试。除非绝对必要,否则最好避免这种耦合,并且确切地知道在使用它时正在做什么

  • 您可以向UserViewModel添加一个名为IsStaff的属性。它将是一个布尔属性。对于员工用户,它将为true,否则为false。然后在执行创建函数后,您将获得当前用户的IsStaff值,并在if条件下检查它,并将它们重定向到不同的操作

    public bool IsStaff{get;set;}
    
    对于创建:

    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();
    }
    

    可能值得在请求时添加一些内容。URLreferer?@Oliver:我考虑过,但这有多可靠?除非框架正在做一些事情来绕过它,否则浏览器可能不会包含引用者。