私は、OnActionExecuting() をオーバーライドして、カスタム ActionFilterAtribute で BaseController クラスを喜んで使用しています。Controller に渡されるときに id ルート値をチェックする便利な方法として、すべてのコントローラーにこの BaseController クラスを使用します。
これはうまくいきました... ID 値を確認し、存在する場合は、ID が属するオブジェクトのタイプを決定するコントローラー名を確認します。
しかし、その後... ControllerBでPartialViewが呼び出され、親Controller/Viewに使用されたFilterContextで同じIDを提示するときに作成されるエラーが発生し始めました。たとえば、localhost/Project/Details/5 の URL があるとします。Project はコントローラーで、Details は id=5 のアクションです。コントローラー「メモ」は PartialView によって呼び出され、今度はコントローラー「メモ」と元の「プロジェクト」ID に対して ActionFilter がトリガーされます。ユーザーは ProjectId=5 へのアクセスを許可されていますが、NoteId=5 へのアクセスは許可されていません
これが理にかなっていることを願っています-説明するのに苦労しています。PartialView を無視するか、処理するか、まったく別のアプローチを使用する方法を見つける必要があります。私の最終目標は、オブジェクトの ID に基づいて、アプリケーションでオブジェクト アクセスをチェックできるようにすることです。この種の問題に対する「最善のアプローチ」はありますか? たぶん、すべてのコントローラーに対してフィルターを作成する必要がありますか? または、アクション名もチェックして、いつ「id」を無視するかを知っていますか?
私の BaseController...
public class AccessCheckAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
int id;
if (filterContext.RouteData.Values["id"] != null)
{
if (int.TryParse(filterContext.RouteData.Values["id"].ToString(), out id))
{
SPTdb db = new SPTdb();
switch (filterContext.RouteData.Values["Controller"].ToString().ToLower())
{
case "project":
project = db.Projects.Find(id);