我将整个布局作为数据库中的字符串,我想将布局从数据库渲染到我的视图。 例如:
public ActionResult index()
{
string layout = GetLayout();
//in below how should I render layout to view
return View("index", layout);
}
我已经使用result = Engine.Razor.RunCompile(template, key.ToString());
来渲染布局,但它无法呈现HTML帮助程序。
答案 0 :(得分:1)
我正在使用下面的代码,它对我来说很好。我也在Web API中使用它来以字符串的形式返回View。
您可以创建静态类,并在下面创建静态方法。
public string RenderPartialView(string controllerName, string viewName, object model = null) {
System.Web.HttpContextBase contextBase = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
var routeData = new RouteData();
routeData.Values.Add("controller", controllerName);
var controllerContext = new System.Web.Mvc.ControllerContext(contextBase, routeData,
new EmptyController());
var razorViewEngine = new System.Web.Mvc.RazorViewEngine();
var razorViewResult = razorViewEngine.FindPartialView(controllerContext, viewName, false);
var writer = new StringWriter();
System.Web.Mvc.ViewContext viewContext;
viewContext = new System.Web.Mvc.ViewContext(controllerContext, razorViewResult.View,
new System.Web.Mvc.ViewDataDictionary(model), new System.Web.Mvc.TempDataDictionary(), writer);
viewContext.ViewData["controller"] = controllerName;
HttpContext.Current.Items.Add("controller", controllerName);
razorViewResult.View.Render(viewContext, writer);
string htmlString = writer.ToString();
writer.Dispose();
return htmlString;
}
private class EmptyController: System.Web.Mvc.ControllerBase {
protected override void ExecuteCore() {}
}
现在请举例说明我们如何从控制器中调用它。
RenderPartialView("Home", string.Format("~/Views/Home/{0}.cshtml", "Index"));
我希望这对你有用。
答案 1 :(得分:0)
似乎没有内置机制来实现那个。需要有一个自定义解决方案。本主题已在本文中讨论过。 Dynamically Produce Razor Views at Runtime?你可以推荐那个。