3

有没有一种方法可以让我在 Razor 视图中做这样的事情:

<h1>Normal razor code</h2>
@Html.Action("NormalRazorCode")

@Eval(" @Html.Action(\"RuntimeEval\") ")

基本上是运行时的 text-to-razor 编译器(例如,它不会像 RazorEngine 那样创建一个全新的视图)。

4

2 回答 2

0

我认为您可以假设视图在编译时存在,并在运行时创建实际文件,这样 ViewEngine 将按照默认方式工作

基本上你可以创建一个Html.Eval助手来创建 .cshtml 文件并在使用Html.Action或渲染它之后Html.Partial

于 2012-07-27T19:36:50.530 回答
0

我想做类似的事情;我将模型数据(在我的控制之下)存储在数据库中,如果我能够在那些包含在页面中时可以“扩展”的字符串中包含 HTML 助手,它将简化我的生活。

主要动机是允许我重用现有的局部视图。

没有eval函数,但您可以轻松编写一个扩展方法,该方法将评估您预先选择允许的方法。就我而言,我想评估对@Html.Partial(). 这里的示例非常简单 - 它专门针对@Html.Partial("somePartialView")调用并将其替换为实际的部分:

    public static IHtmlString ExpandHtmlString(
        this HtmlHelper htmlHelper,
        String html)
    {
        if (String.IsNullOrEmpty(html))
            return new HtmlString(html);

        const String IDENTIFY_PARTIAL = @"@Html.Partial\(""([a-zA-Z0-9\-_]*)""\)";

        var partialFinder = new Regex(IDENTIFY_PARTIAL);
        var matches = partialFinder.Matches(html);

        foreach (Match m in matches) {
            var matchedStr = m.Value;
            var viewName = m.Groups[1].Value;
            var partial = htmlHelper.Partial(viewName);

            html = html.Replace(matchedStr, partial.ToHtmlString());
        }

        return new HtmlString(html);
    }

你从你的 Razor 页面调用它:

@Html.ExpandHtmlString((String)Model.SomeStringField)

您可以轻松地对此进行扩展,以评估您事先决定接受的一组方法或运算符。

于 2020-09-25T20:04:33.723 回答