PDA

View Full Version : سوال: نحوه اضافه کردن یک UserControl به یک string



ohh_mid
جمعه 01 آبان 1388, 22:38 عصر
سلام
من به دنبال راه حلی برای راحت تر استفاده کردن UserControl ها توسط کاربران سیات هستم . فرض کنیم که یک CMS داریم و می خوایم واسه اون یه پلاگین صفحات اضافه کنیم . در قسمتی که مدیر سایت یک صفحه اضافه می کنه م یخوام UserControl ها رو هم به نحوی بتونه توی صفحه اضافه کنه . مثلا می تونه با استفاده از یک تگ خاص که ادرس مربوط به Usercontrol ماست اونو همراه تگ های Html به صفحه اضافه کنه موقعی که صفحه نمایش پیدا میکنه تگی که ما جهت ادرس دهی UserControl استفاده کردیم رندر شه و UserControl ما لود بشه . راستش من با این ایده کمی تحقیق کردم . چیزایی که دستگیرم شد خیلی خوب نبود به یه سری مشکل هم برخورد کردم . مثلا Event های یک UserControl رو به این صورت نمیشه مدیریت کرد . اگر کسی ایده ای برای این کار داشته باشه و یا راهکاری داشته باشه خیلی خوشحال می شم .
از مدیران سایت خواهش می کنم اگر می تونن کمک کنن .

Chabok
شنبه 02 آبان 1388, 00:14 صبح
با سلام

دقیقاً به همین صورت که فرمودید رندر کردن کنترل بصورت دستی و گرفتن خروجی UserControl بصورت رشته باعث عدم کارایی صحیح رویداد ها می شود .

ولی شما می توانید براحتی توسط LoadControl توسط آدرس یوزر کنترل ها آن ها را داخل یک Container مثلاً PlaceHolder لود کنید .

و در صورتی که بخواهید قبل و بعد هر یوزر کنترل مقادیری HTML که در واقع Header , Footer محسوب می شوند اضافه کنید میتوانید این مقادیر را داخل یک کنترل Literal ریخته و قبل و بعد هر لود UserControl آن را به Container خود اضافه کنید .

برای مثال چنین کدی باید بنویسید :

foreach(DataRow Dr in DTModules.Rows)
{
//Render Header
MyPlaceHolder.Controls.Add(new LiteralControl("<div class='Header'></div>"));

//Render Control
MyPlaceHolder.Controls.Add(LoadControl(Dr["UserControlFile"].ToString()));

//Render Footer
MyPlaceHolder.Controls.Add(new LiteralControl("<div class='Footer'></div>"));
}


کد را بصورت ذهنی نوشتم . ممکنه خطا داشته باشه .

ولی خواستم عرض کنم که بدین صورت می توانید ماژول های خود را که بصورت یوزر کنترل هستند بصورت Dynamic و پویا لود کنید .

موفق باشید .

ohh_mid
شنبه 02 آبان 1388, 09:16 صبح
با تشکر از پاسخ شما . ولی مشکل مربوط به قسمتی است که گفتم می خوام یک پلاگین Page داشته باشم و می خوام کاربران سایت خودشون صفحات استاتیک سایت رو طراحی کنند . حالا در قسمتی از این صفحه می خوام از UserControl های آماده استفاده کنند به این صورت که فقط یا یک Id کنترلی رو که می خوان در یک تگ مفدار دهی کنند . خود دات نت در حال حاضر این کار و انجام میده وقتی که ما یک UserControl رو Drag می کنیم در حقیقت همین اتفاق میفته ولی من متاسفانه مکانیسم اجرایی این کار رو بلد نیستم . خواهش می کنم اگر کسی نظری داره برای حل این مشکل یا اینکه با رهکار من کاری انجام داده یا اینکه نحوه اجرای این کار رو می دونه بهم کمک کنه .

Chabok
شنبه 02 آبان 1388, 11:58 صبح
با سلام دوست عزیز
یا من سوال شما رو درست متوجه نشدم . یا شما پاسخ من رو با دقت مطالعه نکردین .

چیزی که من از سوال شما متوجه شدم این است که میخواهید یک سری یوزر کنترل را طبق سلیقه کاربر روی صفحه بچینید . مثلا در ستون عمودی وب سایت .
(اگر منظور شما این حالت نیست خواهشاً سوال خود را واضح تر و شفاف تر بیان کنید)

بر طبق همین سناریو هم خدمتتون عرض کردم که می توانید به صورت این کدی که نوشتم بر اساس ترتیب و فایل یوزر کنترل ها آن ها رو بصورت دستی روی صفحه بچینید .

اصل بحث همین چیدن یوزر کنترل ها بر اساس یک مجموعه است که میتونه در دیتابیس ذخیره شده باشه .

برای مثال در یک جدول اطلاعاتی بصورت زیر دارید :


ID UserControlFile Sort
------------------------------------------
1 Stats.ascx 1
2 Online.ascx 2
3 Polls.ascx 3
بر اساس این جدول شما میخواهید یوزر کنترل ها رو به ترتیب صعودی فیلد Sort در صفحه بچینید .
حال یک دیتاتیبل حاوی این جدول از دیتابیس پر می کنیم و ادامه هم کد بالا میشه .

موفق باشید .

ohh_mid
یک شنبه 03 آبان 1388, 07:14 صبح
خیلی ممنون از اینکه برای مشکل من وقت می گذارید . راستش می خوام خودم صفحه رو رندر کنم . فرض کنید در پلاگین مربوط به صفحات هنگام ساخت صفحه در قسمتی از صفحه نیازی است از UserControl مربوط به لاگین استفاده شود . کاربری که با این پلاگین کار می کند فقط می داند که یک کنترلی به این اسم وجود دارد (منظورم راهنمای مربوطه می باشد ) بنابر این در همان قسمت بر فرض مثال تگی به این صورت قرار می دهد

<CustomControl:Login Address="plugins\Users" Them="Default" />حال هنگامی که تگ های مربوط به صفحه یاد شده رندر می گردند و نمایش داده می شوند بایستی بتوان UserControl که با تگ مربوط به من وجود دارد رندر شده و نمایش داده شود . فقط مشکل این جاست که این حالت به Event های کنترل دسترسی نداریم . البته من بلد نیستم مطمئنا یه راهکاری وجود داره چون خود دات نت و همچنین تکنولوژی MVC بر همین مبنا کار می کنند . فقط من اطلاعاتم در این زمینه خیلی کم هست .

من توضیحات شما رو متوجه می شم ولی مشکل اینجاست که من می خوام یک UserControl رو به یک String اضافه کنم . ما در تگ های صفحه ای که می خواهیم ایجاد کنیم کنترل سروری نداریم که بتونیم یک کنترل رو Load کنیم . و تمام مشکل هم همینجاست . اگر فکر می کنید توضیحاتم ناقص است این مورد را به صورت یه نمونه واقعی توضیح دهم .

باز هم نیازمند راهنمایی شما عزیزان هستم .

Chabok
یک شنبه 03 آبان 1388, 09:52 صبح
با سلام

فکر کنم حالا من باید از شما سوال بپرسم . :لبخند:

اون راهی که در پست اول هم اشاره کردم که میشه خروجی یک یوزر کنترل را رندر کرد و بصورت یک رشته ازش خروجی گرفت این تکه کد است :

Control ctrl = LoadControl("test_control.ascx");

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter htw = new HtmlTextWriter(sw);

ctrl.RenderControl(htw);

string body = sb.ToString();


که همان گونه که اشاره شد رویدادها در این حالت نادیده گرفته می شوند .

ولی واسه من سوال ایجاد شده که شما به چه صورتی توسط این رشته

<CustomControl:Login Address="plugins\Users" Them="Default" />یک یوزر کنترل را به رشته تبدیل می کنید ؟

یعنی این رشته را به چه صورت و کجا می نویسید و توسط چه دستوری آن را اجرا می کنید تا خروجی یوزر کنترل به صورت رشته در اختیار شما قرار گیرد ؟

چون شما فرمودید :

فقط مشکل این جاست که این حالت به Event های کنترل دسترسی نداریم .پس یعنی موفق به انجام این عمل شدین .

چون تا جایی که من دیدم این امکان در زبان های اگه اشتباه نکنم Dynamic بهشون گفته میشه که شما در حین اجرای برنامه هم میتونید یک تکه کد را را به برنامه داده و اجراش کنید .مانند PHP

موفق باشید .

ohh_mid
یک شنبه 03 آبان 1388, 21:19 عصر
سلام
خیلی ممنون که پیگیری می کنید . این یک تگ Custom شده است که توسط خود من در یک متن Html قرار داده میشه حالا دقیقا به همین فرمت نمی تونه باشه ولی Property هایی رو بهش اضافه می کنم و می تونم با استفاده از این Property ها آدرس و them و .. یک Usercontrol رو لود کنم که خودتون به نحوه لود کردن اون اشاره کردین و بلد هستید .پس فقط کافیه قبل از اینکه اطلاعات رو InnerHTML کنیم تگ هایی که به صورت Custom تعریف کردیم رو رندر و بعد نمایش بدیم . البته واسه کنترل هایی که فقط یک Action خاص مثلا Submit دارند راهکار وجود داره ولی اصلا خوب نیست در کل این کار خیلی عجیبی نیست چون همونطور که در پست های بالا هم گفتم خود دات VS در حال حاضر این کار رو انجام میده ولی من بلد نیستم .

همچنان نیازمند راهنمایی اعضای و مدیران محترم این فاروم هستم .

ohh_mid
چهارشنبه 06 آبان 1388, 09:10 صبح
از مدیران سایت خواهشمندم اگه راهنمایی در این زمینه دارند مرا یاری فرمایند .

با تشکر

Chabok
چهارشنبه 06 آبان 1388, 10:03 صبح
با سلام

میشه در مورد این قسمت بیشتر توضیح بدید ؟


در کل این کار خیلی عجیبی نیست چون همونطور که در پست های بالا هم گفتم خود دات VS در حال حاضر این کار رو انجام میده ولی من بلد نیستم .

iman_ad
چهارشنبه 06 آبان 1388, 10:14 صبح
این ایده جالبی به نظر من نیست.
به نظر من باید با دیتابیس کار کنی، مشخصات کنترلی که اضافه می شه تو دیتابیس ذخیره بشه و موقع لود صفحه از دیتابیس بخونی و به پلیس هلدر اضافه کنی.

ohh_mid
جمعه 08 آبان 1388, 12:43 عصر
سلام
در مورد این که فرمودید توضیح بدم در حال حاضر وقتی یک ascx رو به یک صفحه drag می کنید دات نت به جای اون یه تگ تو صفحه می ذاره و اون ascx رو register می کنه حالا من می خوام خودم همین کار رو runtime موقعی که صفحه render میشه انجام بدم . یعنی بر اساس تگ هایی که در یک صفحه گذاشتم و موقعی که می خوام اطلاعات اون صفحه رو رندر کنم در صورتی که تگی مربوط به یک ascx وجود داشت اون رو هم رندر کنم و نمایش بدم .


در مورد دوستم که گفته این کار جالبی نیست و اطلاعات باید رد دیتابیس ذخیره بشن درسته ولی اول باید بشه این کار رو انجام داد . ضمنا قکر می کنم صورت مسئله رو نتونستم خوب توضیح بدم این کاری که دارم می گم اگر بتونم پیاده سازیش کنم باعث میشه کا کاربران سایت خودشون قالب و صفحاتشون رو به تنهایی پیاده سازی کنند . یعنی فقط کافیه بدونن که چه طوری یک کنترل رو باید به یک صفحه اضافه کنند . می دونید مشکل کجاست من در پست های قبلی هم گفتم می خوام یک Usercontrol رو به یک string اضاقه کنم یعنی که من یک UserControl رو execute کنم و تمام Event هاش رو داشته باشم . خیلی ممنون از اینکه Placeholder رو پیشنهاد می دید ولی فکر می کنم عنوان تاپیک چیزه دیگه باشه .


فکر کنید در پنل یک پلاگین صفحات داریم که در این پلاگین می خوایم یک صفحه به سایت اضافه کنیم . به فرض صفحه تماس با ما . این صفحه شامل تعدادی اطلاعات متنی و یک فرم submit مربوط به درج اطلاعات کاربر بازدید کننده می باشد . کاربر شما چه طور باید این اطلاعات رو در صفحه اضافه کنه ؟؟
برای اطلاعات متنی کار خاصی نیست کافیه که متنش رو بزاره و در دیتا بیس ذخیره کنه اما فرم submit رو چه طوری می خواد اضافه کنه ؟؟؟ مگه میشه تو یه htmlEdit یه فرم submit گذاشت در صورتی که هیچ کدی واسش وجود نداره . اما به روشی که من می گم این کار امکان پذیره فقط کافیه ascx اون اماده باشه و کاربر در هر صفحه ای که دوست داشت اونو اضافه کنه .

امیدوارم کسی بتونه کمک کنه

ohh_mid
دوشنبه 11 آبان 1388, 20:11 عصر
وقتی یه تاپیک سر نزنی به آخر می ره و دیگه جوابی واسش نیست . خواهش می کنم اگه امکانش هست مدیران و اقرادی که بر روی portal کار کردن نظر خودشون رو بگن .