我试图在登录请求后处理一个returnUrl字符串,这样:
if (returnUrl is pointing to a ViewResult)
proceed to the requested destination
else
Redirect to home
如何确定url是否指向返回类型为ViewResult的控制器方法?
如何确定url是否指向返回类型为ViewResult的控制器方法?
首先,这不是一个好主意。如果一个方法的结果是ActionResult
,你永远不可能100%知道结果是否是ViewResult
,因为有人可能会改变它
如果您真的决心这样做,那么每个控制器上的每个返回值都将设为ViewResult
。然后,您可以创建一个自定义AuthorizationAttribute,它可以确定用户是否登录,是否填充了ReturnUrl(或其他标志),然后使用反射(这对性能不太好,但它只在登录时,所以基本上可以)来确定方法的返回类型。
我不明白为什么"每个控制器上的每个返回值都必须是ViewResult。">
因为如果不这样做,就不能保证返回类型为ActionResult
的方法是ViewResult
。
DotNetFiddle示例
使用系统;
public class Program
{
public static void Main()
{
var result = typeof(TestController).GetMethod("MyMethod").ReturnType;
Console.WriteLine("TestController:MyMethod returns {0}", result.Name);
}
public class TestController
{
public ActionResult MyMethod()
{
return new ViewResult();
}
}
// mocking System.Web.Mvc
public abstract class ActionResult { }
public class ViewResult : ActionResult { }
public class JsonResult : ActionResult { }
}
结果
TestController:MyMethod返回ActionResult
有人将new ViewResult()
更改为Json(myModel)
,您无法通过反射检测到更改。