PDA

View Full Version : ساخت خودکار Controller,View



SianiD
یک شنبه 17 شهریور 1392, 12:20 عصر
سلام
دوستان راهی هست که در قسمتی از سایت بصورت داینامیک View و Controller ساخت ؟
البته نمیدونم راهش چیه ، میخوام همچین آدرسی بسازم :
www.mydomain.com/reza
بعد بره اطلاعات reza رو از بانک بخونه و این حرفا

hakim22
دوشنبه 18 شهریور 1392, 09:11 صبح
شما با تعریف یک Route میتوانید مقادیر وارد شده در آدرس با را به مسیر های خاصی هدایت کنید. توضیح بیشتری در مورد نیاز خود ارائه دهید.

اگر منظور شما ساختن و ثبت Route به صورت دینامیکی است. این امکان وجود ندارد. اول به این دلیل که این کلاس استاتیک است و در قسمت App_Start اجرا میشود و فقط هنگام راه اندازی فعال میشود. استفاده از Add در زمان اجرا کار نمیکند.

شما نیاز به یک Custom Route Handler دارید. با استفاده از این قابلیت میتوانید یک Route بسازید که از قوانین شما پیروی میکند و مقادیر متنوعی که در آدرس بار وارد میشود مدیریت کند. مثلا یک dll خاصی را فراخوانی کند که آن dll قسمت View رو بسازد

برای تعریف چنین چیزی باید یک کلاس جدید بسازید و از اینترفیس IRouteHandler استفاده کنید.

SianiD
دوشنبه 18 شهریور 1392, 11:08 صبح
ببینید من میخوام مثل ف-ی-س ب-و-ک که برای هر یوزر یک آدرس اختصاصی میده همچین کاری بکنم اما اگه بخوام routing رو تغییر بدم واسه بقیه ی صفحات هم همین تغییر اعمال میشه ، در صورتی که من میخوام فقط یوزر ها به این شکل یک صفحه داشته باشند و اخبار من و بقیه صفحات فرم Default داشته باشند همون Controller/Action/id

hakim22
دوشنبه 18 شهریور 1392, 13:20 عصر
پس شما باید یک Controller Factory بسازید !

ابتدا یک Route جدید ثبت میکنید مثل

username/controller/action/id


بعد یک ControllerFactory به صورت custom میسازید. اول کد نویسی می کنید که حالت پیشفرض را قبول کند و بعد با یک شرط بررسی می کنید که اگر مقدار username وجود داشت آن را از بانک بخواند و بعد موقع ساختن View ها بر اساس نام کاربری پیش برود.

لینک (http://mgolchin.net/posts/18/dive-deep-into-mvc-icontrollerfactory)

SianiD
سه شنبه 19 شهریور 1392, 11:09 صبح
مرسی باید روش کار کنم امیدوارم بتونم خوب پیاده سازیش کنم :چشمک:

اگه اوکی شد سمپل میذارم همیجا

younesdoost
جمعه 22 شهریور 1392, 12:13 عصر
ببینید آدرسی که شما دادید و گفتید که می خواید اطلاعات رضا باهاش بیاد یه مشکلی که داره اینه که احتمالا اون اسم رضا یونیک نیست.پس باید Id رضا رو هم پاس بدید.والا من از فیس بوک زیاد خبر ندارم اما تو تمام سایتای مخصوصا معتبر دیگه اینطوریه آدرس:
www.example.com/1/reza
برای این کار باید با routing کار کنید.اما باید اول بهش مسلط بشید چون وقتی دست کاریش کنید دیگه یکم قضیه فرق می کنه.شما مثلا به یه همچین routing نیاز دارید:


routes.MapRoute(
name: "ShowQuestion",
url: "Home/{id}/{urlSafe}",
defaults: new { controller = "Home", action = "Show", id = UrlParameter.Optional, urlSafe = UrlParameter.Optional }
);

این برای شما آدرسی که بالا گفتم رو میسازه.تو اکشن Show هم id و urlSafe رو میگیرید.اما همونطور که میبینید تو روتینگ به کنترلر Home تاکید کردم.این باعث میشه بقیه ی routing های این کنترلر هم تاثیر بپذیرن که باید بتونید اونها رو هم با روتینگ های مناسب خودشون هندل کنید.مثلا ممکن از این به بعد دیگه آدرس www.example.com درست کار نکنه.اونوقت مثلا احتمالا یه همچین روتینگی باید براش داشته باشید که باید بالا تر از روتینگی که بالا گفتم قرارش بدید:

routes.MapRoute(
name: "Index",
url: "Home",
defaults: new { controller = "Home", action = "Index" }
);

میگم ابتدا خوب مطالعه کنید بعد به این فایل دست بزنید.
اما اگه قراره url فقط به همون شکلی که نشون دادید باشه می تونید به در اکشن به جای اینکه int id رو بگیرید string id رو بگیرید و تو لینکا هم اسم کاربر رو به id اختصاص بدید.ولی خب مثلا شما چون اشاره کردید فیس بوک خب تو اون سایت شما می تونید پروفایل دیگران رو هم ببینید اما اگه تو سایت شما فقط میشه هر کس پروفایل خودش رو ببینه همون روش string id جواب میده.اسم طرف رو بفرستید ولی تو کنترلر به جای اینکه کاربر رو با اسم بیارید با User.Identity.Name لود کنید.
اینجا فضا کافی نیست.باید خوب گوگلش کنید و مطالعش کنید.

SianiD
شنبه 23 شهریور 1392, 10:29 صبح
مرسی از وقتتون که به من دادین ، چظوری میتونم بهش بگم اگه این شرایط پیش اومد از این MapRoute استفاده کنه در غیر اینصورت بصورت پیش فرض باشه ؟
مثلا اگه اسم کنترولر اومده بود از همون Default استفاده کنه اگه یه stirng id بود از MapRoute تعریف شده خودمون ؟

younesdoost
شنبه 23 شهریور 1392, 22:58 عصر
خواهش می کنم.
شما می تونید روتینگ خودتون رو سفارشی شده بسازید.
مثلا یه جاهایی می تونید بگید اون id که میگیره فقط عدد باشه یا حرف که دیگه مشکلی هم پیش نیاد.
در مورد سوال شما خب اون روتینگ دیفالت که پایین تر از همه قرار میگیره و نقشش رو بخوبی ایفا می کنه.برای اینکه بگید فلان کنترلر که بود فلان روتینگ رو اجرا بکنه فقط کافیه تو روتینگی که می نویسید به جای استفاده از {controller} از نام کنترلر استفاده کنید که فقط در حیطه ی همون کنترلر و اکشن هاش اون روتینگ تغییر ایجاد بکنه.ببینید مثلا من یه جا تو یه صفحه یه لیستی از کاربرا رو نشون میدادم و با کلیک رو اسمشون میرفت تو پروفایلشون.روتینگی که نوشتم این بود.

routes.MapRoute(
name: "Index",
url: "User",
defaults: new { controller = "User", action = "Index" }
);
routes.MapRoute(
name: "UserShow",
url: "User/{id}/{name}",
defaults: new { controller = "User", action = "Show", id = UrlParameter.Optional, name = UrlParameter.Optional }
);


الان اینجا اگه کنترلر User اکشن دیگه ای هم داشت اونها هم مورد تاثیر واقع میشدن و باید براشون روتینگ می نوشتم.اما مثلا دیگه کنترلر Account هیچ تاثیری از این روتینگ نگرفته.

SianiD
سه شنبه 26 شهریور 1392, 10:59 صبح
دوست عزیز من این کد ها رو نوشتم اما یه مشکل داره :



routes.MapRoute(
name: "index",
url: "{id}/{urlSafe}",
defaults: new { controller = "Test", action = "show", id = UrlParameter.Optional, urlSafe = UrlParameter.Optional }
);

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);




وقتی آدرس رو همونطوری که میخوام مثل www.example.com/reza میزنم درست کار میکنه اما دیگه www.example.com رو no found میده و تشخیص نمیده که مثلا باید کنترلر Home رو باز کنه .
حتی وقتی میزنم www.wxample.com/home/index باز هم تشخیص نمیده .

پس Default اینجا چیکار میکنه ؟

younesdoost
شنبه 30 شهریور 1392, 23:07 عصر
نه.ببینید دیفالت برای کنترلرهاییه که برای هیچکدوم از اکشناشون روتینگ ننوشتید.همین که برای یکی از اکشن های یه کنترلر روتینگ بنویسید کل اکشنای اون کنترل ازش تاثیر می گیرن.الان مشکل شما اینه که تو روتینگی که نوشتید به اسم کنترلر اشاره ای نکردید.پس ایندفعه اون صفحه هایی تاثیر می گیرن که آدرسشون از همون تعداد بخش تشکیل شده.الان www.example.com/reza (http://www.example.com/reza) با www.example.com یا www.example.com/homeیا www.example.com/home/indexیا www.example.com/reza/index (http://www.example.com,www.example.com/home,www.example.com/home/index,www.example.com/reza/index) و همچنین با www.example.com/userیا www.example.com/article,...فرقی (http://www.example.com/user,www.example.com/article,...فرقی) نداره!
برای واضح تر شدن باید تو اون روتینگ که urlSafe رو می گیرید قبلش بگید که این برای کدوم کنترلره که حداقل فقط اکشن های همون کنترلر تاثیر بگیرن.

SianiD
یک شنبه 31 شهریور 1392, 13:50 عصر
راستش یک مقدار گیج شدم الان دقیقا باید چیکار کنم که با زدن www.example.com مشکلی پیش نیاد www.example/home/about/2 کار کنه
و همون www.example.com/reza هم کار کنه ؟