1

私は、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);
4

1 に答える 1