8

asp.net Web フォーム (c#) と MS SQL Server を使用して、週刊誌の Web サイトのバックエンド データベースとして CMS ベースの Web サイトを設計する必要があります。

サンプルデータ

MagazinePages Table
PageID  PageName    LangID  PagePositionNo  PageURL     PageInheritance //PageID 
1           Home        1         10        Default.aspx    0
2           About Us    1         20        Page.aspx       0
3           PageOne     1         10        Page.aspx       2
4           PageTwo     1         20        Page.aspx       2
5           Media           1         30        Page.aspx       0
6           Video       1         10        Videos.aspx     5
8           News        1         40        News.aspx        0
9           Archive     1         50        #               0
10          Publication 1         60        Page.aspx       0
11          SpanishHome 2         10        Default.aspx        0
12          SpanisAboutUs 2       20        Page.aspx   0
------------------------------------------------------------------------------
Magazine
MagazineID  MagazineIssueCode   LangID  MagazineTitle   MagazineLiveIssue(CurrentIssue)
1       1           1   Mag Title       0
2       2           1   Mag Title       1
3       1           2   SpanisgMag Title    0
4       2           2   Mag Title       1
------------------------------------------------------------------------------

News Table
NewsID  NewsTitle   NewsCatID   MagazineID  Language    
1   News one    100     1       1
2   News two    100     1       1
3   news three  200     1       1
4   News four   300     1       1
5   News Five   100     2       1
6   News Six    300     2       1
7   News seven  200     2       2
------------------------------------------------------------------------------

上記のアプローチの問題は、上記の例に基づいて、すべてのレコードがMagazinePagesにある場合にのみサブメニューを作成できることです。「私たちについて」とマルチメディアのサブメニューを作成できます。別のテーブルからデータを取得できるようにデータベースを設計するにはどうすればよいですか?カテゴリ別のニュース(政治、文化...) &雑誌の表からの問題 (101 号、102 号、103 号....)

これには ASP メニュー コントロールを使用する予定ですが、これはあまり柔軟ではない可能性があります。これは、asp.net でどのように、またはどのマルチ カラム メニューを使用できるかについて、100 を超える雑誌を発行する予定だからです。

私のデータベースには多くのフローが含まれている可能性があります。このデータベースをこの CMS システムに使用できるように、この点について助けていただければ幸いです。これに関して何かあればお気軽に質問してください。

追加: テーブルからすべてのメニュー名を取得する必要がある場合MagazinePagesは簡単ですが、例に示すようなメニュー構造にするよう求められました。これの問題は、テーブルからAboutUs&のメニューを生成できることですが、ニュースのように情報が別のテーブルに保存されているため、このテーブルには政治、経済、... 問題 101、102、103 などのページがありません。テーブル &テーブルの問題。テーブルのデザインを変更して、別のテーブルからメニュー情報を柔軟に読み取れるようにしたいのですが、方法がわかりませんMultimediaMagazinePagesNews CategoryMagazine

News テーブルは、このスキーマには表示されません。

私が行ったことは、Home、Aboutus、Contact、MediaCentre ..... などの CMS ページ用に ps_Pages テーブルを作成したことです。

雑誌に関連するページ(実際には、文化、政治、スポーツ、人々などのさまざまなカテゴリまたはタグを持つ記事です...)をart_Articleテーブルに保存します

4

4 に答える 4

4

単一のページでコンテンツを扱ってみませんか?

電話するだけPage.aspx?Issue=4&Page=4

次に、コードでそれが 4 番目の問題であり、ページ 4 が必要であることがわかっている場合、それを変換してレイアウトを決定するコードを Page.aspx (.vb または .cs) に含めることができます。

ソーエグ

Page.aspx?Issue=4&Style=Article&Content=5

したがって、コードでは、問題 4 で問題 4 のデータベース エントリを取得し、問題 4 のコンテンツ ID 5 が必要であり、記事のスタイルに配置できます。

つまり、データベース タイプに余分なページを追加する必要はなく、必要に応じてコンテンツを追加するだけで済み、コンテンツにアクセスするための URL を生成するアイテムは、すべてのコンテンツを表示するだけで済みます。

于 2012-10-16T10:41:12.680 に答える
3

データベース スキーマを再評価する必要があると思います。たとえば、「ParentMenuItems」というテーブルがあります

このテーブルには、すべてのトップ メニュー項目 (ホーム、会社概要、問題など) が含まれ、子メニューのテキストが含まれます。次に、親メニュー項目との関係を持つ ChildMenu テーブルが必要です。

ParentMenuItems:
==============================================================
ID       | LinkText      | LangID     | Other Properties
==============================================================
1        | Home.aspx     | 1          | blah blah blah
2        | AboutUs.aspx  | 2          | blah blah blah

次に、次のような「ChildMenuItems」という別のテーブルを作成できます。

ChildMenuItems:
===============================================================
ID   | LinkText       | LangID |  ParentID  | Other Properties...
===============================================================
1    | PageOne.aspx   | 1      | 2          | blah blah blah
2    | PageTwo.aspx   | 2      | 2          | blah blah blah

コードは次のように機能します。

SELECT * FROM ParentMenuItems - //SQL to get Items

次に、SQL の結果を列挙する foreach コードを記述します。

foreach(var ParentMenuItem in ParentMenuItems)
{ 
    //Get ParentMenuItem ID, run SQL select on child menu items, Example:
    //SELECT * from ChildMenuItems where ParentID = ID.FROM.PARENT.RESULT
    // Now you have all the child menu items, foreach those and add to repeater control
}

これが役立つことを願っています。ご不明な点がございましたら、お知らせください。

ヒント: Entity Framework は、これを非常に簡単に処理します。

于 2012-10-22T23:15:08.563 に答える
2

何が必要なのかよくわかりませんが、雑誌ごとのメニューではなく、システム全体のメニューを作成したいと考えていると思いますよね?

もしそうなら、私はあなたが間違った問題を見ていると思います.問題はデータベーススキーマではなく、あなたのメニューは標準が定義されていないN個の異なるテーブルによって自動的に埋められるべきであるという概念です.

メニュー テーブルを作成し、magazinepages と menu を 2 つの別個のテーブルにします。CMS のようなシステムを作成している場合は、カテゴリ、問題、およびメニュー エントリを完全に別々に編集できるページがおそらくあるでしょう。他のテーブルから。

また、「タグ」システムを作成して、すべてのニュースと問題を専用のカテゴリに入れる代わりに「タグを付ける」ことができます。政治と文化を同時に語るニュースが可能になる。次に、ユーザーを多数の異なる pages.aspx に誘導する代わりに、content.aspx?tag=politics を使用します。タグを作成するとき、このタグを「ニュース」、「問題」などの下のメニュー テーブルに追加するオプションがありました。カテゴリと問題についても同じです。

ニーズに合わない場合は、これらのオプションを試すことができますが、メニューエントリの特定の表以外のすべての解決策は、私の脳に「警告、将来の問題が検出されました」と表示されます。

1 - 特定のルールに従ってこのテーブルを埋めるストアド プロシージャであるメニュー テーブルを作成し、「category」などのテーブルをトリガーして切り捨ててストアド プロシージャを呼び出し、コンテンツが変更されるたびにメニューを書き換えます (私には簡単な修正のように聞こえます)。 )

2 - 「submenu_table」、「submenu_field」、「submenu_condition」などをマガジンページに追加し、動的 ​​SQL を使用してデータを選択します (のようなものSet @SQL='Select '+ submenu_field + ' from '+ submenu_table + ' where ' + submenu_condition; Exec(@SQL)) (別の簡単な修正、重い、おそらく遅いクエリ)

(編集:) 3 - SQL 2008以降にはhierachyIdフィールドもあります([http://blogs.msdn.com/b/manisblog/archive/2007/08/17/sql-server-2008-hierarchyid.aspx]) 1

于 2012-10-24T02:49:41.567 に答える
2

メニューのテーブルを作成する

CREATE TABLE [dbo].[tblMenuMaster](
[MenuID] [int] IDENTITY(1,1) NOT NULL,
[MenuName] [varchar](100) NULL,
[DisplayOrder] [int] NULL,
PRIMARY KEY CLUSTERED 
(
[MenuID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

サブメニュー用に別のテーブルを作成する

CREATE TABLE [dbo].[tblSubMenuMaster](
[SubMenuID] [int] IDENTITY(1,1) NOT NULL,
[MenuID] [int] NULL,
[SubMenuName] [varchar](100) NULL,
[MainMenuDisplayOrder] [int] NULL,
[DisplayOrder] [int] NULL,
[SubMenuUrl] [varchar](500) NULL,
[VisibleInMenu] [bit] NULL,
PRIMARY KEY CLUSTERED 
(
[SubMenuID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

マスター ページに移動します。HTML コードは次のとおりです。

   <div class="menubar">
        <%--<ul class="tabs">--%>
        <asp:Literal ID="ltMenus" runat="server"></asp:Literal>
        <%--</ul>--%>
    </div>

コードの背後にあるコードは次のとおりです。

private void GenerateMenus()
{
    clsMenu obj = new clsMenu();
    System.Data.DataSet ds = new System.Data.DataSet();
    String PageName = "";
    PageName = Path.GetFileName(Page.AppRelativeVirtualPath);
    ds = obj.GetMenusByRole(GetRoleId(), PageName);

    StringBuilder sb = new StringBuilder("<ul class='tabs'>");

    foreach (System.Data.DataRow row in ds.Tables[0].Rows)
    {
        sb.Append(String.Format("<li class='{0}'><a rel='{1}' href='{1}' > {2} </a> ", Convert.ToString(row["css"]), ResolveUrl(Convert.ToString(row["PagePath"])), Convert.ToString(row["MenuName"])));
        //sb.Append(String.Format("<li '><a rel='{0}' href='{0}' > {1} </a> ", ResolveUrl(Convert.ToString(row["PagePath"])), Convert.ToString(row["MenuName"])));

        System.Data.DataTable t = CCMMUtility.GetFilterDataforIntColumn("MenuID", Convert.ToString(row["MenuID"]), ds.Tables[1]);
        if (t.Rows.Count > 0)
        {
            sb.Append("<ul>");

            for (int i = 0; i < t.Rows.Count; i++)
            {
                sb.Append(String.Format("<li><a href='{0}' class='dir' style='cursor: pointer;'>{1}</a></li>", ResolveUrl(Convert.ToString(t.Rows[i]["PagePath"])), Convert.ToString(t.Rows[i]["PageAliasName"])));
            }

            sb.Append("</ul>");
        }
        sb.Append("</li>");
    }

    sb.Append("</ul>");


    ltMenus.Text = sb.ToString();

}

以下のようにロール ID に従ってメニューのダイナミックを呼び出すストアド プロシージャが必要です。

CREATE PROCEDURE [dbo].[proc_GetMenusByRole]
(
@RoleId int,  
@PageName varchar(100)
)
AS
SET NOCOUNT ON;
SELECT mm.MenuID, mm.MenuName,dbo.Extract_CssNameForMenuByMenuIDAndPageName(mm.MenuID, @PageName) as css
,dbo.proc_Extract_MenuPageByRoleIDAndMenuID(@RoleId, mm.MenuID)
as PagePath , mm.DisplayOrder   FROM tblMenuMaster mm WHERE mm.MenuID IN (SELECT s.MenuID from tblSiteRolePermissions p INNER JOIN
tblSitePages s ON p.fkSitePageId = s.pkSitePageId
WHERE (p.fkRoleId = @RoleId and p.ViewOnly=1))   
Union All   
select 0 as menuid ,'Change Password' as MenuName,  
case @pagename   
when 'ChangePassword.aspx' then 'active'  
else ''  
end  as css,'~/User/ChangePassword.aspx' as PagePath, 10000 as Displayorder  
ORDER BY DisplayOrder     
SELECT s.MenuID, s.pkSitePageId, s.PageAliasName, s.SitePageName,s.pagepath from tblSiteRolePermissions p 
INNER JOIN tblSitePages s ON p.fkSitePageId = s.pkSitePageId  WHERE (p.fkRoleId =@RoleId and p.ViewOnly=1) ORDER BY s.pkSitePageId  

//ここから新しいspが始まります

CREATE function [dbo].[Extract_CssNameForMenuByMenuIDAndPageName](@MenuID int, 
PageName varchar(100))
returns nvarchar(50)
as begin      
declare @result nvarchar(50) 
set @result = ''    
IF EXISTS (SELECT pkSitePageId FROM tblsitepages WHERE (MenuID = @MenuID) AND (UPPER(SitePageName) = @PageName)) 
 BEGIN    
  SET @result = 'active'    
 END    
return @result    
end  

// 使用される別の sp は

CREATE function [dbo].[proc_Extract_MenuPageByRoleIDAndMenuID]
(@RoleId int, @MenuID int)
returns nvarchar(500) 
as begin          
declare @result nvarchar(500)
SELECT top 1 @result = s.pagepath FROM tblSitePages AS s INNER JOIN tblSiteRolePermissions AS p ON s.pkSitePageId = p.fkSitePageId
WHERE (p.fkRoleId = @RoleId) AND (s.MenuID = @MenuID)  and p.ViewOnly=1
ORDER BY s.pkSitePageId 
return  @result
end  

これを行うための単なる方法であり、要件に応じてこれを変更できます........

proc_Extract_MenuPageByRoleIDAndMenuID sp は、ページ名とそのパスを取得するために使用されます。

Extract_CssNameForMenuByMenuIDAndPageName sp は、アクティブなクラスを最初に設定するために使用されます。liは最初のメニューを意味します。これがあなたを助けることを願って.....その作業コード..

于 2012-10-23T04:53:23.313 に答える