我有一个带有大约 8 或 9 个操作方法的 HomeController。
其中大约 7 种方法需要检查用户是否有特殊设置,以查看是否允许他们访问这些方法和相关视图。
如果不是,它们将被重定向回通用操作方法和视图。
public class HomeController : Controller
{
public ActionResult Index() {
UserManager um = new UserManager();
um.Punter p = um.GetPunter(User.Identity.Name);
return View(p);
}
public ActionResult PunterList() {
UserManager um = new UserManager();
um.Punter p = um.GetPunter(User.Identity.Name);
if (p.isPunter) {
return RedirectToAction("Index", "Home");
} else {
return View(p);
}
}
}
'PunterList' 中的检查是在其他操作方法中完成的,我正在考虑创建一个 FilterAttribute 来执行此检查。根据以下内容:
public class NoPunterAttribute : FilterAttribute, IActionFilter {
public void OnActionExecuting(ActionExecutingContext filterContext) {
UserManager um = new UserManager();
um.Punter p = um.GetPunter(User.Identity.Name);
if (p.isPunter) {
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Home" }, { "action", "Index" } });
}
}
public void OnActionExecuted(ActionExecutedContext filterContext) { }
}
然后将此属性放在此类用户无法访问的 Action 方法上。
[NoPunter]
public ActionResult PunterList() {
UserManager um = new UserManager();
um.Punter p = um.GetPunter(User.Identity.Name);
return View(p);
}
这会将这段代码放在适当的1
位置,但是UserManager.GetPunter
如果User.isPunter=false
. 也许这对于 MVC Web 应用程序的性能或内存节约来说不是一个好主意。
好处是在请求管道中更早地进行检查,但也许在操作方法内部调用的方法意味着 .GetPunter 只会被调用一次,但会沿着请求管道更远。不确定这一点,在早期与性能/内存问题上存在分歧。
任何建议或想法都会很有趣。大概这取决于里面做了什么UserManager.GetPunter
。此调用中有一些缓存,但它会重新查询缓存。