2013-12-07 5 views
1

Я пытаюсь динамически визуализировать страницы из базы данных. Вид выглядит следующим образом:ASP.NET MVC4 @ MvcHtmlString.Create() проблемы с @ Html.RenderPartial()

@model MyModel 

@{ 
    ViewBag.Title = Model.Title; 
    Layout = Layout = "~/Views/Shared/_PageInnerLayout.cshtml"; 
} 

@MvcHtmlString.Create(Model.Content) 

MyModel имеет 3 свойства; Id, Title and Content

Если у Content есть только HTML, представление выглядит просто отлично. Но в некоторых случаях мне также нужно отдать частичные части. Так Content может содержать код, как

@{ 
    Html.RenderPartial("_FooterPartial"); 
} 

Это не работает. Его время буквально переводится, как показано на рисунке ниже

Example of rendered page

Как это исправить, так что страница отображается правильно?

+0

вы можете добавить флаг, например 'IsPartialContent' модель, и если это правда, то оказывать частичные Мануалы, также вы можете видеть на [razorgenerator] (http://razorgenerator.codeplex.com/) – Grundy

+0

@Grundy Я не совсем понял ваш ответ. Не могли бы вы рассказать? – Vivek

+0

Я понял, что содержание может быть только html или строка 'renderpartial' без какого-либо другого html-кода – Grundy

ответ

1

Проблема заключается в разнице между Html.RenderPartial и Html.Partial вспомогательными методами. RenderPartial непосредственно напишите результат HttpContext.Response, а Partial верните его как MvcHtmlString. Вам необходимо заменить RenderPartial на Partial и, возможно, RenderAction с Action.

Отредактировано:

Вы должны визуализировать содержание, если содержит вид бритвы скриптов. Если это так, вы фактически храните views или partial views внутри базы данных. Вы можете создать новый файл VirtualPathProvider для загрузки представлений из базы данных. Для получения дополнительной информации см. ASP.NET MVC load the Razor views from database и ASP.NET MVC and virtual view

+0

. Я попробовал. Это не работает. – Vivek

+0

@Vivek Вам необходимо отобразить содержимое «Model.Content» в виде представления, если оно содержит сценарии просмотра бритвы, внутри действия контроллера, прежде чем передать его для просмотра. –

+0

@Vivek См. Обновленный ответ –

0

Я попытался сделать это с помощью VirtualPathProvider, но это не сработало.

Наконец, я сделал, чтобы написать контент из базы данных во временный вид, а затем визуализировать представление. Он работал

public ActionResult DynamicPage(int id) { 
    var dynamicPage = new PagesContext().Pages.FirstOrDefault(s => s.Id == id); 

    string webroot = Server.MapPath("~").TrimEnd('\\'); 
    string fileName = webroot + "\\Views\\\\Solutions\\Temp.cshtml"; 

    System.IO.File.WriteAllText(fileName, dynamicPage.Content); 
    return View("Temp"); 
} 

Здесь, содержание свойства dynamicPage containts HTML (включая Razor код)

+0

. Я прошу не согласиться, это решение имеет проблемы с производительностью, и оно также не является потокобезопасным.Несколько запросов, выполняемых в нескольких потоках, пытаются записать в один файл, что приводит к проблемам синхронизации. –

+0

@ KambizShahim Да. Это проблема. Любые предложения, пожалуйста? – Vivek

Смежные вопросы