对于“取消”操作,您可以完全跳过服务器端的参与,并使用 JavaScript 将浏览器引导到其先前的位置。(这还有一个额外的好处,那就是支持将来从另一个地方来到那里的任何人。)这样的事情:
<input type="button" value="Cancel" id="cancelButton" />
<!-- and later... -->
<script type="text/javascript">
$('#cancelButton').click(function () {
window.history.back();
});
</script>
对于“保存”操作,您能否在服务器上辨别他们是哪种“类型”用户并相应地指导他们?如果没有,也许您需要在 Create 操作首次响应视图时跟踪它们的来源。也许该操作可以接受重定向作为参数?像这样的东西:
public ActionResult Create(string redirectUrl)
然后,您可以将该参数添加到创建视图模型中,将其存储在隐藏字段或类似性质的东西中。当您在保存时发回创建操作时,您将再次将其包含在该参数集中并将其用于重定向(当然,如果它是空的,则默认为特定页面)。
然后,每当您有一个@Html.ActionLink
to时,Create
您就会将 aredirectUrl
作为路由值包含在内。
编辑:为了完整起见,正如 Oliver 在下面的评论中提到的,您可以尝试通过Request.UrlReferrer
. 这将在非发布调用中Create
用于自动填充将在发布调用中返回的隐藏字段。(因为在帖子调用中,引用者是页面本身,所以这没有帮助。)但是请记住这里的两个主要事项:
- 浏览器控制引荐来源网址,而您没有。一些浏览器可能会发送错误的引荐来源网址,或者更常见的是根本没有。它可能在 10 次中有 9 次有效,也可能不会。但是,再次出于完整性考虑,它可以用作后备来捕获您(或其他开发人员)没有明确包含 a
redirectUrl
作为路由值的情况。
- 这将控制器耦合到 HTTP 上下文。对于您的需求来说,这可能永远不会成为问题,但它首先破坏的是该操作方法的单元测试。除非绝对必要,否则最好避免这种耦合,并在使用时确切知道自己在做什么。