检测重定向到另一个 URL

Detecting redirect to a different URL

我正在使用 ASP.NET MVC 和 AngularJs 框架。在我的家庭控制器中,我正在检查是否有有效的许可证,如果没有,我将重定向到一个页面以使用以下代码导入许可证:

public ActionResult Index()
        {
            var retVal = _licenseProvider.ValidateExistingLicense();

            if (!retVal.Item1)
            {                
                Response.Redirect("DataMaintenance/ImportLicenses", true);
                return View("DataMaintenance/ImportLicenses");
            }

所以,在我的 ImportLicenses 控制器中,我想检测我是被重定向还是从菜单中调用。我找到了一个关于重定向到不同操作的旧线程,但该解决方案不适用。我在这里有什么选择?

这里有几个选项:

  1. 在 ImportLicenses 操作中添加查询字符串参数 确定用户是通过重定向还是菜单到达此处

  2. 在将用户重定向到 ImportLicenses 操作。

  3. 使用一个Session变量

Read this for more information about passing data between Action methods.

这真的取决于你的限制,有很多选择。对您的项目了解不多。我的第一个建议是在重定向之前删除一个 cookie,然后当请求进入 ImportLicenses 操作时,您可以检查检查并删除它,但包括是否在您的视图模型中找到了 cookie,以便您可以反映这在 UI.

还有其他选项,例如使用会话状态或查询字符串参数。 querystring 参数可能和我上面提到的 cookie 想法一样有效,而且会更干净一些。

如果您可以提供有关您的用例的更多信息,我或许可以扩展我的答案。

希望对您有所帮助。

与此同时,我决定做点作弊,但它奏效了。在菜单中,我将原来的调用更改为此

 dataMaintNodes.SubNodes.Add(new MenuMapNode() { LabelKey = "importLicense", Action = "ImportLicenses", Controller = "ImportLicenses", Area = "DataMaintenance", Icon = "", Roles = "IMPORTLIC" });

换句话说,我引入了一个不同的操作,而不是正常的 Index 操作。我将该新操作添加到我的控制器,并在从菜单调用时将 ViewBag 属性 设置为 false,在重定向调用的 Index 操作中设置为 true。所以,这是一种作弊,但它有效。当我从常规菜单调用时,我只想在该模式对话框上显示取消按钮,而当从家庭控制器调用时,我不想显示取消按钮。现在,我的第二个问题是模态对话框并没有真正阻止从它转义并继续使用应用程序。所以,我们可能要引入更多的逻辑。