【问题标题】:Is there a function similar to Eval() in asp.net razor?asp.net razor中是否有类似Eval()的函数?
【发布时间】:2012-07-27 10:29:49
【问题描述】:

有没有一种方法可以让我在 Razor 视图中执行类似的操作:

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

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

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

【问题讨论】:

  • 我可以知道你为什么需要这个吗?
  • 首先想到的是在 cms 编辑器中,能够拥有像 @Url.Action("Post", new { id = 5}) 这样的强类型链接,这些链接将自动更新为最新的规范 url版本
  • latest canonical url version 是什么?
  • 例如可以是 showposts/{category}/{post-alias} 。虽然postsController/postsAction/5 形式的链接可以作为永久链接,但showposts/categoryx/newest-funniest-post 更好,并且会使用最新的 mvc 路由自动更新。
  • 我愿意,但是在您从数据库下载的字符串中,您不能使用路由。我有 atm 的解决方法是像这样进行后处理:@Html.RazorParse(text) 这是这样的:text.replace( [Url{actionName}]", Url.Action(actionName)

标签: asp.net-mvc razor runtime eval


【解决方案1】:

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

基本上你可以创建一个 Html.Eval 帮助器来创建 .cshtml 文件,然后使用 Html.ActionHtml.Partial 渲染它

【讨论】:

  • 感谢您的回复,但这是一个真正的新模板,如剃须刀引擎,增加了文件 I/O 成本!
  • asp.net 也读取文件,因此仍然涉及 I/O,在您的情况下您也可以编写它们,但是您可以只编写一次并仅在数据库中的模板发生更改时重写它
【解决方案2】:

我想做类似的事情;我将模型数据(在我的控制之下)存储在数据库中,如果我能够在那些包含在页面中时可以“扩展”的字符串中包含 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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2011-08-01
    • 2014-06-14
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多