یک پروژه ی Web Application در ویژوال استودیو بسازید و نام پروژه را همنام با نام ماژولی که می خواهید بنویسید بگذارید.
فایلها و پوشه های اضافی مثل App_Data و Web Config، Default.aspx را پاک نمایید. فعلا فقط پوشه های Properties و References را نیاز داریم.
روی پوشه ی Properties کلیک نمایید تا باز شود، یا راست کلیک و open. (روی علامت + اش نه، روی خودش کلیک نمایید چون نمی خواهیم وارد پوشه شویم). در صفحه ای که باز می شود، در اولین تب (Tab) به نام Application سه قسمت هست که باید به آن توجه کنید:
Assembly name

که باید مانند مثال کامل باشد
Default namespace

که بهتر است و معمولا با Assembly name یکی است
DotNetNuke.Modules.XXX
Target Framework

که یک دراپ دان دارد و امکان انتخاب ورژن دات نت فریم ورک را فراهم کرده است.اگر ماژولی که می نویسید برای دات نت نیوک ۵ (DNN 5) باشد ورژن ۳٫۵ را باید انتخاب کنید در این صورت ماژولی که نوشتید روی همه نسخه های قبلی DotNetNuke 5. هم کار می کند اما روی نسخه های بالاتر اگر از فریم ورک مثلا .۴ در آنها استفاده شده باشد کار نمی کند. مثلا برای دات نت نیوک نسخه ی ۴ به پایین باید Framework 2.0 رو انتخاب کنید و …با این روش می توانید ماژول مختص به ورژن های خاصی از نیوک را تولید نمایید.
سپس تب را ذخیره کرده و ببندید.
پوشه ی بعدی، پوشه ی References است. اینجا باید یک reference اضافه کنیم به نام : DotNetNuke.dll ازکجا؟! از داخل پوشه ی bin پرتالی که قبلا نصب کرده اید. (یا به هر حال پرتالی که می خواهید نصب کنید. مثلا اگر می خواهید از پکیج DNN 5. به بالا استفاده کنید و فریم ورک را هم ۳٫۵ انتخاب کرده اید dll ی که اینجا ادد می کنید باید از داخل همان پکیج باشد.)
Right-Click on References > Add Reference > Browse tab > Look in ….
حالا بعد از انجام کارهای پایه ای به بررسی بخش ها و صفحات ماژول می پردازیم:
یک یوزر کنترل (Web user control) همنام با پروژه مان، به پروژه اضافه می کنیم :
Right-Click on project name > Add > New Item > WebUserControl.ascx
که به جای Web User Control اسم صفحه تان را می نویسید.
نکته: اولین صفحه که بیس اصلی ماژول هست و Action Command ها را اینجا تعریف می کنیم بایستی همنام ماژول تعریف شود. (روال معمول به این صورت است)
پس فعلا اولین صفحه مان که صفحه ی اصلی ماژول هست را می نویسیم.همان طور که می دانید یوزر کنترل ها صفحات Code behind دارند که کدهای کلاس برنامه آنجا قرار دارند (مثلا در زبان سی شارپ Name.ascx.cs ها) که فعلا ما با این فایلها کار داریم نه فایلهای name.ascx که کدهای مربوط به دیزاین و کنترل های مورد نیاز مثل لیبل (Label) و باتن (Button) و .. در آن قرار می گیرد.
خوب صفحه ی ascx.cs را باز کنید:
اینجا دو نکته داریم:

using ها (که با توجه به Reference ی که اضافه کردیم ، namespace هایی که برای نوشتن ماژول لازم هستند را اضافه می کنیم) برای صفحه ی اصلی

بعنوان مثال :
using DotNetNuke;
using DotNetNuke.Common;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Services.Localization;
using DotNetNuke.Entities.Modules.Actions;
Namespace خط ۴ و ۵ فقط توی همین صفحه کاربرد دارند. خط ۴ برای متون و کلماتی که برای نام صفحات و آیتم های موجود در آنها بکار گرفته می شود استفاده می گردد. و خط ۵ برای تعریفAction Command ها که اگر به خاطر بیاورید همان کلیدهایی هستند که ما را به صفحات دیگر هدایت می کردند.

ارث بری : برای صفحه ی اصلی مان که از Action ها استفاده می کنیم از دو کلاس و در واقع از یک Class (به نام PortalModuleBase ) و یه Class Interface (به نام : I Actionable ) ارث می بریم :
public partial class YourClassName : PortalModuleBase,IActionable

نکته: برای صفحه های دیگر به جز صفحه تنظیمات که در جای خودش راجع به آن صحبت خواهیم کرد، فقط کافی ست که کلاس هایمان از کلاس PortalModuleBase ارث ببرند.
برای تعریف کلیدها نیاز به تابع داریم که ساختار کلی آن برای ماژول های متفاوت ، مشابه هست و این تابع را اولِ کلاس و قبل از تابع Page_Load تعریف می کنیم.
public Entities.Modules.Actions.ModuleActionCollection ModuleActions
{
get
{
Entities.Modules.Actions.ModuleActionCollection _actions = new Entities.Modules.Actions.ModuleActionCollection();
//——————تعریف هر کلید
ModuleAction AddImage = new ModuleAction(GetNextActionID());
AddText.Title = Localization.GetString(“AddImage”,LocalResourceFile);
AddImage.CommandName = ModuleActionType.PrintModule;
AddImage.CommandArgument = “”;
AddImage.Icon = “../DesktopModules/YourModuleName/images/OK.gif”;
AddImage.Url = EditUrl(“AddImage”);
AddImage.Secure = Security.SecurityAccessLevel.Edit;
AddImage.UseActionEvent = true;
AddImage.Visible = true;
AddImage.NewWindow = false;
_actions.Add(AddImage);
//——————
return _actions;
}
}
در خط ۱۲ تعریفِ _action را داریم که ثابت است و در واقع یک مجموعه تعریف می کنیم که کلیدهایمان را چند خط پایین تر با تابع Add به آن اضافه می کنیم. و در آخر هم تابع ،کل مجموعه کلیدها یا همون Action Collection ها را برمی گرداند.
: قطعه کدی که بین علامت کامنت قرار گرفته است برای تعریف هر کلید تکرار می شود که آیتم های دیگری هم می تواند داشته باشد . مهم ترین هایش را بررسی می کنیم:
در خط ۱۶ کلید مورد نظرمان را تعریف می کنیم و درخط های بعدی آیتم های مورد نیازمان را به آن اختصاص می دهیم.مثلا عنوان کلید (در واقع Action مان) و آیکن آن ، آدرسی که هدایت می کند و …
در خط ۱۷ عنوان Action ماژولمان را مشخص می کنیم (که اگر دقت نمایید برایش یک Namespace هم تعریف کرده بودیم) که واژه هایی که اینجا نوشته می شود متن کلید است که شما بعدا در اجرای ماژول آنها را می بینید و برای نمایشش باید این واژه به فایل Resx مربوط به صفحه ی مورد نظرمان اضافه شود . برای ترجمه ی این واژه ها به فارسی (یا هر زبانی) باید این کلمه به فایل Resx مربوط به آن زبان مثلا برای فارسی Fa-IR.Resx هم اضافه و هم ترجمه شود .توضیح اینکه چگونه این کار را انجام دهید در شماره ۸ گفته شده است.
در خط ۲۰ می توانیم یک آیکن برای کلیدمان تخصیص بدهیم. برای این کار می توانیم یک پوشه به نام Images به پروژه ی ماژولمان اضافه کنیم و تصویرهایمان را آنجا قرار دهیم.
در خط ۲۱ اسمی که برای url می نویسیم در واقع اسم صفحه ای خواهد بود که این کلید ما را به آنجا هدایت خواهد کرد. در مراحل بعدی باید یک یوزر کنترل دیگر دقیقا به همین نام به پروژه اضافه کنیم که برای مثال اینجا ما اسمش را گذاشتیم AddImage یعنی می خواهیم یه ماژول داشته باشیم که یک سری تصویر را نمایش بدهد و با کلیک روی این کلید به صفحه ای هدایت می شویم که امکان اضافه کردن تصاویر را به ما می دهد.
و اما اضافه کردن فایلهای Resx : برای این کار اول یک پوشه ی App_ Local Resources به پروژه اضافه می کنیم:
Right-Click on project name > Add ASP.NET Folder > App_LocalResources
و بعد باید به این پوشه فایل rscx را اضافه کنید:
Right-Click on App_LocalResources > Add > New Item > Resources File
نام فایل Resource1.resx که اضافه شده است را تغییر می دهیم و به جای Resource1 اسم کامل صفحه مان را با پسوند ascx اضافه می کنیم:
XXX.ascx.resx
و برای ترجمه فارسی اش و در واقع همان بومی شدنش این فایل را اضافه می کنیم:
XXX.ascx.fa-IR.resx
زمانیکه این فایل ها را باز می کنید سه ستون می بینید که در ستون Name واژه ای که می خواهیم نمایش داده شود و ترجمه شود را به صورت Word. Text قرار می دهیم و در ستون Value چیزی که می خواهیم برای واژه مورد نظر نمایش داده شود را می نویسیم. در ستون سوم که Comment نام دارد می توانیم توضیحاتی را بنویسیم یا ننویسیم. برای مثال در این مثال بالا:
AddImage.Text Add Image //for xxx.ascx.resx
AddImage.Text تصویر را اضافه کن //for xxx.ascx.fa-IR.resx
در این مرحله تا اینجای برنامه را build می کنیم و فایلها و پوشه های مورد نظر را به پرتال اضافه می کنیم و ماژول را نصب می کنیم. پس روی نام پروژه راست کلیک و سپس build را می زنیم تا فایل dll ماژول تا اینجای کار ساخته شود.

در یک پروژه ی دات نت نیوکی که قبلا نصب و اجرایش کرده اید مثلا روی لوکال ، مرحله به مرحله ماژول را ایجاد می کنیم و اجرا را می بینیم.
در مسیر زیر یک پوشه به اسم ماژولمان می سازیم و پوشه های App_LocalResources و Images را به همراه فایل های ascx – که فعلا یک فایل داریم – از پوشه ی پروژه مان به این پوشه اضافه می کنیم:
Portal Root Folder > Desktop Module Folder > Your Module’s Folder Name
فایل dll که به نام ماژولمان هست را از پوشه ی bin پروژه مان برداشته و در پوشه ی bin پرتال کپی می کنیم.
سایت را اجرا کرده و وارد پرتال می شویم و به قسمت تعریف ماژول از منوی میزبان (Host) رفته و ایجاد ماژول جدید را انتخاب می کنیم.

در صفحه ای که باز می شود Create Module From: Control را انتخاب کرده و صبر می کنیم تا صفحه یه بار پست بَک شود تا آیتم های آن بارگذاری شوند و بعد آیتم های Module Folder و Module Name را انتخاب و کامل می کنیم و در صورت تمایل می توانید تیک مربوط به ساخته شدن صفحه ی تست Add Test Page را هم بزنید که روال انجام کار را مشاهده نمایید.

در انتها لینک ایجاد ماژول جدید را کلیک نمایید.
بعد از این کار دوباره برمی گردیم به صفحه تعریف ماژول و کنار ماژولی که ایجاد کردیم روی لینک ویرایشش کلیک می کنیم و وارد ویرایش ماژول می شویم. در قسمت Module Controls با کلیک روی Add Module Control کنترل مربوط به این صفحه ای از ماژول که ایجاد کردیم را اضافه می کنیم. وارد صفحه ی افزودن کنترل می شویم.
در صفحه ی افزودن کنترل، دو حالت داریم:
یکی اینکه صفحه ی ما، صفحه ی اصلی ماژول باشد مثل صفحه ای که الان اضافه کردیم که در اینصورت فقط آیتم های زیر باید کامل شوند: Module ،Definition ، Source ، Type =View .
برای صفحه های بعدی ای که اضافه می کنیم، علاوه بر موارد قبل باید Key و Title هم کامل شوند. برای key باید دقیقا همان عباراتی را که جلوی EditUrl در تابع صفحه ی اصلی ماژول نوشتیم بنویسیم . البته این برای صفحه ی Settings ماژول فرق دارد و در صفحه ی مربوط به تنظیمات key = Settings خواهد بود. به جای Title هم یک عنوان برای ماژول که معمولا همان نامش هست را می نویسیم.
نکته ی مهم این است که در صفحاتِ به جز صفحه ی اصلی ماژول Type = Edit انتخاب می شود.
حالا می توانید با مراجعه به صفحه ی تست که به منوها اضافه شده است کلید اضافه شده در فِلش کوچک باز شونده ماژول را مشاهده نمایید…