Asp.NET MVC – Programatik Olarak .cshtml Dosyasını Render Etmek
Merhaba,
Bu yazımızda Asp.NET MVC mimarisinde programatik olarak PartialView(.cshtml) dosyalarının nasıl render edildiğini irdeleyeceğiz.
Tabi konuya girmeden önce dilerseniz eğer bir View dosyasının normal yollarla nasıl render edildiğini tekrardan inceleyelim.
public class HomeController : Controller { public ActionResult Index() { NorthwindEntities Veri = new NorthwindEntities(); var Personeller = Veri.Personeller.ToList(); return View(Personeller); } }
Yukarıdaki gibi bir Controller sınıfında herhangi bir Action metotda görüldüğü üzere model View’e gönderilmektedir.
@model IEnumerable<WebApplication1.Models.Personeller> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.SoyAdi) </th> <th> @Html.DisplayNameFor(model => model.Adi) </th> <th> @Html.DisplayNameFor(model => model.Unvan) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.SoyAdi) </td> <td> @Html.DisplayFor(modelItem => item.Adi) </td> <td> @Html.DisplayFor(modelItem => item.Unvan) </td> </tr> } </table>
View’de model yukarıdaki gibi karşılanıp render edilmektedir.
Normal düzeyde olayımız bu kadar basit…
Peki bu işlemi programatik olarak nasıl yapacağız? sorusuna gelirsek eğer aşağıdaki Helper sınıfını inceleyiniz.
public class Helper { public static string RazorViewRender(object model, string filePath) { var sw = new StringWriter(); var context = new HttpContextWrapper(HttpContext.Current); var routeData = new RouteData(); var controllerContext = new ControllerContext(new RequestContext(context, routeData), new HomeController()); var razor = new RazorView(controllerContext, filePath, null, false, null); razor.Render(new ViewContext(controllerContext, razor, new ViewDataDictionary(model), new TempDataDictionary(), sw), sw); return sw.ToString(); } }
Oluşturmuş olduğumuz bu Helper sınıfı verilen modeli verilen filePathe göndermekte, render etmekte ve sonucuda string olarak döndürmektedir.
Haliyle aşağıdaki örnek kullanım alanlarına misal teşkil edebilir.
public class HomeController : Controller { public ActionResult Index() { NorthwindEntities Veri = new NorthwindEntities(); var Personeller = Veri.Personeller.ToList(); ViewBag.Render = Helper.RazorViewRender(Personeller, "~/Views/Home/_PersonelListesi.cshtml"); return View(); } }
---- _PersonelListesi.cshtml @model IEnumerable<WebApplication1.Models.Personeller> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.SoyAdi) </th> <th> @Html.DisplayNameFor(model => model.Adi) </th> <th> @Html.DisplayNameFor(model => model.Unvan) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @item.Adi </td> <td> @item.SoyAdi </td> <td> @item.Unvan </td> </tr> } </table>
-- Index.cshtml @if (ViewBag.Render != null) { @Html.Raw(ViewBag.Render); }
Gördüğünüz gibi, Index Action metodu içerisinde Helper sınıfımızda yazmış olduğumuz RazorViewRender metodu aracılığıyla _PersonelListesi.cshtml dosyası verilen model ile render edilmekte ve bir ViewBag.Render kontrolüne atılmaktadır. Haliyle Index.cshtml’de bu ViewBag.Render kontrolü çağrılmakta ve html olarak ekrana basılmaktadır.
Oluşturmuş olduğumuz bu Helper sınıfı sayesinde Asp.NET MVC projelerinde arka planda PartialView’leri render ederek, yeri ve zamanı geldimi jQuery – Ajax yapıları eşliğinde bu yorumları kullanabiliriz. Vee buna benzer daha nice çalışmalar gerçekleştirebiliriz…
Okuduğunuz için teşekkür ederim…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…
Mükemmel; kilit bilgidir. Teşekkür ederim.
Faydalanmanız dileğiyle…
Sevgiler.