我正在使用带有AngularJs框架的ASP.NET MVC。在我的家庭控制器中,我正在检查是否有有效的许可证,如果没有,我将使用此代码重定向到导入许可证的页面:
public ActionResult Index()
{
var retVal = _licenseProvider.ValidateExistingLicense();
if (!retVal.Item1)
{
Response.Redirect("DataMaintenance/ImportLicenses", true);
return View("DataMaintenance/ImportLicenses");
}
因此,在我的ImportLicenses控制器中,我想检测到我是从菜单中重新定向与调用的。我找到了一个关于重定向到不同操作的旧线程,但该解决方案不适用。我有什么选择?
答案 0 :(得分:1)
你有几个选择:
在ImportLicenses操作中添加查询字符串参数 通过重定向或菜单确定用户是否到达此处
在将用户重定向到之前设置TempData
变量
ImportLicenses行动。
使用Session
变量
Read this for more information about passing data between Action methods.
答案 1 :(得分:1)
这实际上取决于你的约束,有很多选择。不了解你的项目。我的第一个建议是在重定向之前删除cookie,然后当请求进入ImportLicenses操作时,您可以检查检查并删除它,但是包括是否在视图模型中找到了cookie以便您可以反映在UI中。
还有其他选项,例如使用会话状态或查询字符串参数。查询字符串参数可能与我上面提到的cookie概念一样有效,而且它会更清晰。
如果您可以提供有关您的用例的更多信息,我可以扩展我的答案。
希望这有帮助。
答案 2 :(得分:0)
与此同时,我决定做一些作弊,但它确实有效。在菜单中,我将原始调用更改为此
dataMaintNodes.SubNodes.Add(new MenuMapNode() { LabelKey = "importLicense", Action = "ImportLicenses", Controller = "ImportLicenses", Area = "DataMaintenance", Icon = "", Roles = "IMPORTLIC" });

换句话说,我引入了不同的动作,而不是正常的索引动作。我向控制器添加了新操作,并在从菜单调用时将ViewBag属性设置为false,并在Redirect调用的Index操作中将其设置为true。所以,这是作弊行为,但它确实有效。我只想在从常规菜单调用时在该模式对话框上显示取消按钮,而在从家庭控制器调用时不显示取消按钮。现在,我的第二个问题是Modal Dialog并没有真正阻止它逃脱并继续使用该应用程序。所以,我们可能想要引入更多的逻辑。
答案 3 :(得分:0)
我刚尝试了另一种基于此主题中的注释和我之前看到的主题的解决方案。我使用了Response.RedirectToAction方法(如建议的评论),我添加了这段代码:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
ViewBag.needValidLicense = false;
if (filterContext.Result is RedirectResult)
{
ViewBag.needValidLicense = true;
}
base.OnActionExecuted(filterContext);
}
然而,这不起作用,例如结果未显示为RedirectResult。我将从菜单调用时恢复使用单独操作的原始解决方案。