مشکل در ساختن Layout جدید در MVC5
سلام دوستان .
من دارم با MVC5 یه سایت خبری میسازم . و الان به مشل بر خوردم . قسمت خبر اصلی یه Layout جدا داره و قسمت خبر ( که شامل متن کامل خبر میشه ) هم یه Layout جدا داره .
حالا من میخوام وقتی کاربر روی خبر مورد نظر کلیک میکنه بره و به Layout طراحی شده برای قسمت کامل خبر و خبر رو نمایش بده . باید چیکار کنم ؟؟؟؟؟؟؟
9 پاسخ
خب منم همین کارو کردم ولی بازم خطا میده . به کدی ک گذاشتم نگاه بندازید متوجه میشید .
خب اخه URL که شما Type می کنید اسم Action رو نداره و یک راست ایدی رو بهش دادید!
(تنها در یک صورت این باید کار کنه اونم اینه که کنترلر و ویوی دیفالت شما داخل فایل routConfig این کنترلر و اکشن تعریف شده باشه)
خلاصه توی ادرس بار اسم کنترلر و Action رو تایپ کنید و بعد ایدی رو بهش بدید :
localhost:28613/ControllerName/ActionName/Id
ببنید شما دو تا Leyout رو که ایجاد کردید فقط کافیه که بالای هر View مشخص کنید که کدوم Leyout برای این View نمایش داده بشه :
@{ Layout = "~/Views/Shared/_NewsLayout.cshtml"; }
این رو بالای هر View ( بعد از @mode ... ) بنویسید و آدرس layout مورد نظرتون رو بدید. توجه داشته باشید همه ی layout ها به صورت پیشفرض توی فولدر Shared هستن .
یه Layout ساختم .
داخل Controller یه Action ساختم .
public ActionResult NewsDetail(int id) { return View(RNews.GetDetailNews(id)); }
public Tbl_News GetDetailNews(int id) { try { var qGetDetailNews = (from a in db.Tbl_News where a.ID.Equals(id) select a).SingleOrDefault(); return qGetDetailNews; } catch (Exception) { return null; } }
@{ ViewBag.Title = "NewsDetail"; Layout = "~/Views/Shared/_NewsDetail.cshtml"; } @model IRI_MVC.Models.Domain.Tbl_News <div class="ditail-col-primary"> <div class="story-body"> @{ <span>@Model.Title</span> <div class="byline"> <span>نویسنده :@Model.Username </span> <br /> <span> </span> </div> <div class="story-body-info"> <ul class="mini-info"> <li>@Model.Date<img src="img/measurement-units-time-icon.png" /></li> </ul> <div class="share"> <a href="#"> <img src="img/Uiconstock-Stitched-Social-Media-Share.ico" /> </a> </div> </div> <div class="story-body-main"> <figure class="media"> <span class="media-image"> <img src="img/NewsPic/@Model.Image" /> </span> <figcaption class="media-caption"> <span>@Model.Title</span> </figcaption> </figure> <div class="media-caption-text"> <span> @Model.Text </span> </div> <div class="comment"> <div class="get-comment"> </div> </div> </div> } </div> </div>
این کدها این خطا رو میزنه . باید چبکار کنم ؟
منظورم اینه که این مشکل رو چطور باید حل کنم ؟ کجا باید تغییرات ایجاد کنم ؟ Layout رو باید چیکارش کنم ؟
دوست عزیز، شما به همون صورت که به صورت عادی Layout ایجاد می کنید و استفاده می کنید می تونید چند تا Layout داشته باشید. برای مثال، تو پوشه Shared شما دو Layout به صورت زیر تعریف کردید:
~/Views/Shared/_Layout.cshtml ~/Views/Shared/_NewsLayout.cshtml
حالا شما تو View ای که دارید می تونید حسب نیاز Layout ای که مورد نیازتون هست رو به صورت زیر انتخاب کنید:
@{ Layout = "~/Views/Shared/_NewsLayout.cshtml"; }
خب من باید چیکار کنم ؟
دوست عزیز، مشکل شما بحث Routing هست، شما باید Route رو برای Action ها تعریف کنید یا اگر تعریف نکردید از Route پیش فرض استفاده کنید. برای مثال فرض کنید Controller و Action شما به صورت زیر تعریف شده:
public class NewsController : Controller { public ActionResult Details(int id) { return View(); } }
اگر Route پیش فرض که داخل فایل RouteConfig.cs در پوشه App__Start تغییر نکرده باشه، به صورت پیش فرض آدرس نمایش Action بالا به صورت زیر هست:
http://site.com/news/details/10
اما اگر Route رو تغییر داده باشید، اونوقت بر اساس Route تعریف شده نمایش داده میشه، برای مثال، داخل فایل RouteConfig.cs به صورت زیر یک Route برای Action بالا تعریف می کنیم:
public static void RegisterRoutes(RouteCollection routes) { routes.MapRoute("ShowNews","news/show/{id}",new{controller="News", action="Details"}); }
با تعریف Route بالا، دسترسی به بخش نمایش خبر به صورت زیر میشه:
http://site.com/news/show/10
چی رو چیکار کنید ؟ Leyout رو که مهندس احمدی فرمودند.