Soru ASP.NET MVC 3'te bir dizeye bir Razor View nasıl oluşturulur?


Siteyi çok araştırıyorum, ancak tek bulabildiğim kısmi kontrollerin nasıl oluşturulacağına dair örnekler vardı. .ascxveya bir denetleyici bağlamına bağlı.

Yalnızca görüntünün göreli yolunu ve modelini sunmamı ve bu görünümü bu modelde bir dizeye dönüştürmemi sağlayan bir yöntem istiyorum:

string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model);

Bulduğum tüm örnekler ya MVC'nin eski sürümleriydi ya da burada yapmam gerekeni yapmadı.


25
2018-02-11 19:37


Menşei




Cevaplar:


Bunu başarabilirsin. razorengine.

string template = "Hello @Model.Name! Welcome to Razor!";
string result = Razor.Parse(template, new { Name = "World" });

Ve denetleyici bağlamına güvenmiyor - ancak bu nedenle, Html yardımcılarını kullanamıyorsunuz (http bağlamına güveniyor). Ancak, ustura ipleri için bir şablon motoru olarak kullanmak mükemmeldir.


27
2018-03-12 02:41



Bir cshtml dosyasında jilet şablonunun kilitli olması durumunda bu işi yapmanın bir yolu var mı? Partiye biraz geç olduğunu biliyorum. - Henk Jansen
Endişelenme - Hala etrafımdayım :) Ve tabi ki File.ReadAllText(path); değişkene. - Marc
Nesneleri (modelleri) görüntüye geçirebilir misiniz? @Marc - Kennyomar
@Kennyomar O ikinci çizgide görünümüne bir model geçiyor. - JLRishe
Proje razorengine çok değişti, şimdi kullanmak gerçekten zor, RazorHosting kullanmanızı tavsiye ederim github.com/RickStrahl/Westwind.RazorHosting - Daniel


Bu bağlantıyı kontrol edebilirsiniz.

çıkarılan içerik Tıraş Razor görünümü String. .

public static string RenderRazorViewToString(string viewName, object model)
{
    ViewData.Model = model;
    using (var sw = new StringWriter())
    {
        var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);
        return sw.GetStringBuilder().ToString();
    }
}

12
2018-02-11 19:44



Sorun, bu örneğin, bu yöntemi çağırmaya çalıştığım yer olmayan bir denetleyici bağlamı gerektirir. - bevacqua


Benim için çözüm yaratmıştım. Görünümü dizeye işleyen Uzantıdır.

public static class RenderPartialToStringExtensions
{
    /// <summary>
    /// render PartialView and return string
    /// </summary>
    /// <param name="context"></param>
    /// <param name="partialViewName"></param>
    /// <param name="model"></param>
    /// <returns></returns>
    public static string RenderPartialToString(this ControllerContext context, string partialViewName, object model)
    {
        return RenderPartialToStringMethod(context, partialViewName, model);
    }

    /// <summary>
    /// render PartialView and return string
    /// </summary>
    /// <param name="context"></param>
    /// <param name="partialViewName"></param>
    /// <param name="viewData"></param>
    /// <param name="tempData"></param>
    /// <returns></returns>
    public static string RenderPartialToString(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData)
    {
        return RenderPartialToStringMethod(context, partialViewName, viewData, tempData);
    }

    public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData)
    {
        ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName);

        if (result.View != null)
        {
            StringBuilder sb = new StringBuilder();
            using (StringWriter sw = new StringWriter(sb))
            {
                using (HtmlTextWriter output = new HtmlTextWriter(sw))
                {
                    ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output);
                    result.View.Render(viewContext, output);
                }
            }

            return sb.ToString();
        }
        return String.Empty;
    }

    public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, object model)
    {
        ViewDataDictionary viewData = new ViewDataDictionary(model);
        TempDataDictionary tempData = new TempDataDictionary();
        return RenderPartialToStringMethod(context, partialViewName, viewData, tempData);
    }
}

Ve biz de Eylemde görüntü oluşturabileceğimizden

[HttpPost]
public ActionResult GetTreeUnit(string id)
{
    int _id = id.ExtractID();
    string render = ControllerContext.RenderPartialToString("SomeView");
    return Json(new { data = render });
}

10
2018-02-22 12:50





Marc'ın cevabı doğru olsa da ve önceki sürümler için çalışıyor. Ama şimdi bu artık satılıyor ve değiştirilmesi gerekiyor.

İşte benim için çalışan yeni kod ve Github hakkında daha yararlı bilgiler bulabilirsiniz: Jiletli Motor

string template = "Hello @Model.Name! Welcome to Razor!";
string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });

4
2017-11-30 05:36