C# 如何判断我的控制器操作是否正在从另一个控制器操作调用?

C# 如何判断我的控制器操作是否正在从另一个控制器操作调用?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,有什么简单的方法可以区分ASP.NET MVC控制器操作是由于客户端web浏览器请求而“直接”命中的,还是由于控制器而命中的。RedirectToAction调用或RedirectToRoute结果?请求。服务器变量[“http\u referer”]我认为,如果是从重定向到操作的操作被命中,则将是空的。否则,它将是对应于“直接”访问的操作方法的URL 善良 Dan您可以选择向操作方法添加一个参数,该参数允许您传入一个值,指定它是控制器。重定向到操作、重定向到路由还是客户端浏览器请求。再加上一些

有什么简单的方法可以区分ASP.NET MVC控制器操作是由于客户端web浏览器请求而“直接”命中的,还是由于
控制器而命中的。RedirectToAction
调用或
RedirectToRoute
结果?

请求。服务器变量[“http\u referer”]我认为,如果是从重定向到操作的操作被命中,则将是空的。否则,它将是对应于“直接”访问的操作方法的URL

善良

Dan

您可以选择向
操作
方法添加一个参数,该参数允许您传入一个值,指定它是
控制器。重定向到操作
、重定向到路由还是客户端浏览器请求。再加上一些服务器变量检查,您可能会想出一些在大多数情况下都有效的方法

public ActionResult MyAction(string source)
{
    if (source == "")
    {
        // client browser request
    }
    else if (source == "redirectToAction")
    {
        // redirect to action
    }
    else if (source == "redirectToRoute")
    {
        // redirect to route
    }
}

或者,在TempData中输入一个值

public class SomeController : Controller
{
    public ActionResult SomeAction()
    {
        // ... do stuff ...
        TempData["SomeKey"] = "SomeController.SomeAction";
        return RedirectToAction("SomeOtherAction", "SomeOtherController");
    }
}

public class SomeOtherController : Controller
{
    public ActionResult SomeOtherAction()
    {
        if (TempData.ContainsKey("SomeKey"))
        {
            // ... do stuff ...
        }
        // etc...
    }
}

(From)

你为什么在意?对于这个问题,可能有一个更好的解决方案,而不是试图区分这一点。我的操作中有一个属性,用于指示是否应该仅在SSL下提供页面。如果应该,但请求是在普通的旧http下发出的,那么我将当前请求重定向到SSL。到目前为止,一切顺利。但在某些情况下,可以从另一个控制器操作调用相同的操作。在这种情况下,我不想执行重定向。我可以做一些重构来分离这些关注点,但我只是想知道是否有任何简单的方法可以检测操作的“源”。正如下面其他人所建议的那样,您可以使用Session/TempData来解决这个问题,但是没有明确的方法可以知道。这对MVC 1来说很好,但在MVC 2中可能很脆弱。MVC 2在您阅读之前不会清除密钥,因此,如果您“忘记”在某个地方阅读它,那么会话中可能会有一个“过时”密钥。感谢CraigAh的突出说明,所以ASP.NET MVC的TempData将赶上Rails的“flash hash”?很不错的!我很喜欢MVC2。