Чтение Razor View Переменные Программно - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть «виджеты», содержащиеся в частичных представлениях, и перебираю эти файлы для создания списка доступных виджетов. В этих представлениях есть две переменные

@{ ViewBag.Name = "Test Widget"; }
@{ ViewBag.Description = "This is a test widget"; }

говорит само за себя. Есть ли способ с помощью RazorEngine (или любым другим способом) «прочитать» эти переменные, чтобы я мог показать значение ViewBag.Description в моем списке виджетов?

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

RazorEngine с пользовательским базовым видом может использоваться для этой цели:

public class MyViewModel
{
    public string Name { get; set; }
    public string Description { get; set; }
}

class Program
{
    static void Main()
    {
        // don't ask me about this line :-)
        // it's used to ensure that the Microsoft.CSharp assembly is loaded
        bool loaded = typeof(Binder).Assembly != null;

        Razor.SetTemplateBase(typeof(FooTemplateBase<>));
        string template = 
@"@{ ViewBag.Name = ""Test Widget""; }
@{ ViewBag.Description = ""This is a test widget""; }";
        var model = new MyViewModel();
        var result = Razor.Parse(template, model);
        Console.WriteLine(model.Name);
        Console.WriteLine(model.Description);
    }
}

namespace System.Web.Mvc
{
    public abstract class FooTemplateBase<T> : TemplateBase<T>
    {
        public dynamic ViewBag
        {
            get
            {
                return Model;
            }
        }
    }
}
1 голос
/ 02 ноября 2011

Вы можете использовать RazorGenerator для фактической компиляции представлений, а затем выполнить пример их выполнения, чтобы иметь возможность читать данные.

См. Эту статью о модульном тестировании видов бритвы, аналогичная вещь может работатьдля вас:

http://blog.davidebbo.com/2011/06/unit-test-your-mvc-views-using-razor.html

var view = new Index();

// Set up the data that needs to be accessed by the view
view.ViewBag.Message = "Testing";

// Render it in an HtmlAgilityPack HtmlDocument. Note that
// you can pass a 'model' object here if your view needs one.
// Generally, what you do here is similar to how a controller
//action sets up data for its view.
HtmlDocument doc = view.RenderAsHtml();

//recall name and description
var name = view.ViewBag.Name;
var description = view.ViewBag.Description;

Вот дополнительная информация о генераторе бритвы от Фила Хаака: http://haacked.com/archive/2011/08/01/text-templating-using-razor-the-easy-way.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...