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