Использование Razor View Engine по-другому

Я подумал, что было бы интересно использовать новый движок MVC Razor View в качестве технологии слияния. Он все еще может быть частью веб-сайта MVC и не обязательно должен быть автономным консольным приложением.

Пример:

string  myTemplate = "Hello @Name,  How are you today?";
ViewModel.Name = "Billy Boy";
string output = RazorViewEngineRender( myTemplate, ViewModel );

Тогдаstring output = "Hello Billy Boy, How are you today?"

Главное, я хочу, чтобы шаблон управлялся из строки, а не из представления или частичного представления.

Кто-нибудь знает возможно ли это ?

ОБНОВИТЬ:

Бен и Мэтт сделали проект на codeplex:http://razorengine.codeplex.com/

Ответы на вопрос(1)

Решение Вопроса
Предупреждение

который был взломан без тестирования, кроме как заставить его работать должным образом.

VirtualPathProvider

Поскольку мы не имеем дело с реальными представлениями на сервере, мы должны добавить нашего собственного поставщика пути, чтобы сообщить MVC, где получить наши динамически генерируемые шаблоны. Должно быть больше тестов, таких как проверка словаря строк, чтобы увидеть, было ли добавлено представление.

public class StringPathProvider : VirtualPathProvider {
    public StringPathProvider()
        : base() {
    }

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) {
        return null;
    }

    public override bool FileExists(string virtualPath) {
        if (virtualPath.StartsWith("/stringviews") || virtualPath.StartsWith("~/stringviews"))
            return true;

        return base.FileExists(virtualPath);
    }

    public override VirtualFile GetFile(string virtualPath) {
        if (virtualPath.StartsWith("/stringviews") || virtualPath.StartsWith("~/stringviews"))
            return new StringVirtualFile(virtualPath);

        return base.GetFile(virtualPath);
    }

    public class StringVirtualFile : System.Web.Hosting.VirtualFile {

        string path;

        public StringVirtualFile(string path)
            : base(path) {
            //deal with this later
                this.path = path;
        }

        public override System.IO.Stream Open() {
            return new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(RazorViewEngineRender.strings[System.IO.Path.GetFileName(path)]));
        }
    }
}
Класс рендеринга

Этот класс принимает ваш шаблон в качестве параметра конструктора и добавляет его в статический словарь, который затем читаетсяVirtualPathProvider выше. Вы тогда звонитеRender и вы можете по желанию передать в модели. Это добавит полный тип модели к@inherits и добавьте это к содержимому файла.

public class RazorViewEngineRender {
    internal static Dictionary<string, string> strings { get; set; }

    string guid;

    static RazorViewEngineRender() {
        strings = new Dictionary<string, string>();
    }

    public RazorViewEngineRender(string Template) {
        guid = Guid.NewGuid().ToString() + ".cshtml";
        strings.Add(guid, Template);
    }

    public string Render() {
        return Render(null);
    }

    public string Render(object ViewModel) {
        //Register model type
        if (ViewModel == null) {
            strings[guid] = "@inherits System.Web.Mvc.WebViewPage\r\n" + strings[guid];
        } else {
            strings[guid] = "@inherits System.Web.Mvc.WebViewPage<" + ViewModel.GetType().FullName + ">\r\n" + strings[guid];
        }

        CshtmlView view = new CshtmlView("/stringviews/" + guid);

        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        System.IO.TextWriter tw = new System.IO.StringWriter(sb);

        ControllerContext controller = new ControllerContext();

        ViewDataDictionary ViewData = new ViewDataDictionary();
        ViewData.Model = ViewModel;

        view.Render(new ViewContext(controller, view, ViewData, new TempDataDictionary(), tw), tw);
        //view.ExecutePageHierarchy();

        strings.Remove(guid);

        return sb.ToString();

    }
}
Global.asax

В вашем файле global.asax вы должны будете добавить следующее кApplication_Start

System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new Controllers.StringPathProvider());
Вызывая код
string Template = "Hello, @Model.Name";
Models.User user = new Models.User() { Name = "Billy Boy" };
RazorViewEngineRender view = new RazorViewEngineRender(Template);
string Results = view.Render(user); //pass in your model
Заметки

этотолько работает с типизированными моделями. Я попытался передать новый {Name = "Billy Boy"}, и он выдает ошибки. Я не уверен, почему и не слишком углубился в это.

Это было весело, спасибо, что задали этот вопрос.

 Buildstarted29 сент. 2010 г., 21:24
Я создал образец, который работает без MVC, и вы можете найти его в моем блоге, так как слишком много, чтобы добавить еще один пост.buildstarted.com/2010/09/29/...
 Buildstarted10 февр. 2011 г., 00:21
Этобыло часть MVC3. Я думаю, что это устарело в пользуWebFormView но не цитируйте меня :)
 Jim28 сент. 2010 г., 22:13
Хорошая работа! Я попробовал это, и это прекрасно работает для меня. На самом деле это довольно мощный инструмент для создания отчетов, пользовательских писем и т. Д.
 3Dave09 февр. 2011 г., 23:34
@ здесь определен класс CshtmlView? Я не могу этого или какой-либо документации по нему, и класс RazorView не кажется совместимым.

Ваш ответ на вопрос