非常に長い一日のバックエンドにいるのか、ライターズブロックに相当するコーダーを持っているのかはわかりませんが、これを行うためのクリーンな方法は考えられません。
Webページのメニュー構造を格納するテーブルがあり、Webアプリケーションのセッションパラメータに基づいて関連するメニュー項目を返す簡単なストアドプロシージャが必要です。
次の(簡略化された)例を見てください。
--#### Create example table
CREATE TABLE [dbo].[tbl_Page](
[PageID] [int] IDENTITY(1,1) NOT NULL,
[RequireLogin] [bit] NOT NULL,
[RequireAdmin] [bit] NOT NULL,
[HideIfLoggedIn] [bit] NOT NULL
)
GO
--#### Insert Dummy Data
SET IDENTITY_INSERT [dbo].[tbl_Page] ON
INSERT [dbo].[tbl_Page] ([PageID], [RequireLogin], [RequireAdmin], [HideIfLoggedIn]) VALUES (2, 1, 0, 0)
INSERT [dbo].[tbl_Page] ([PageID], [RequireLogin], [RequireAdmin], [HideIfLoggedIn]) VALUES (3, 1, 1, 0)
INSERT [dbo].[tbl_Page] ([PageID], [RequireLogin], [RequireAdmin], [HideIfLoggedIn]) VALUES (4, 0, 0, 1)
INSERT [dbo].[tbl_Page] ([PageID], [RequireLogin], [RequireAdmin], [HideIfLoggedIn]) VALUES (5, 0, 0, 0)
SET IDENTITY_INSERT [dbo].[tbl_Page] OFF
--#### Create menu procedure
CREATE PROCEDURE usp_GetSubMenu
@ParentID INT ,
@IsLoggedIn BIT ,
@IsAdmin BIT
AS
BEGIN
SET NOCOUNT ON;
SELECT PageID ,
RequireLogin ,
RequireAdmin ,
HideIfLoggedIn
FROM tbl_Page
WHERE ????????????
END
GO
与えられたサンプルデータの場合、次のことが当てはまる必要があります。
- ページID2は、次の場合にのみリストする必要があります
@IsLoggedIn = 1
- ページID3は、
@IsLoggedIn = 1
ANDの場合にのみリストする必要があります@IsAdmin = 1
- ページID4は、(ログインユーザー(および管理者ユーザー)を必要とするが、それでも非表示にする必要があるページがある場合を除いて、常にリストする必要があります-これは私の脳が爆発するビットです... )
@IsLoggedIn = 1
- ページID5は、ユーザーがログインしているかどうかに関係なく、また管理者であるかどうかに関係なく、ログインを必要とせず、ログインしたユーザーに対して非表示にされないため、常に表示される必要があります。