有没有一种方法可以让我在 Razor 视图中做这样的事情:
<h1>Normal razor code</h2>
@Html.Action("NormalRazorCode")
@Eval(" @Html.Action(\"RuntimeEval\") ")
基本上是运行时的 text-to-razor 编译器(例如,它不会像 RazorEngine 那样创建一个全新的视图)。
有没有一种方法可以让我在 Razor 视图中做这样的事情:
<h1>Normal razor code</h2>
@Html.Action("NormalRazorCode")
@Eval(" @Html.Action(\"RuntimeEval\") ")
基本上是运行时的 text-to-razor 编译器(例如,它不会像 RazorEngine 那样创建一个全新的视图)。
我认为您可以假设视图在编译时存在,并在运行时创建实际文件,这样 ViewEngine 将按照默认方式工作
基本上你可以创建一个Html.Eval
助手来创建 .cshtml 文件并在使用Html.Action
或渲染它之后Html.Partial
我想做类似的事情;我将模型数据(在我的控制之下)存储在数据库中,如果我能够在那些包含在页面中时可以“扩展”的字符串中包含 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)
您可以轻松地对此进行扩展,以评估您事先决定接受的一组方法或运算符。