Asp.net mvc 3 Razor-如何将内容呈现为变量

Asp.net mvc 3 Razor-如何将内容呈现为变量,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,如何在Razor中将一段Html呈现为变量? 在Spark中,我曾编写以下代码: <content var="t"> <a class="tab" href="">Tab name</a> </content> <content var="tc"> <div class="tabcontent"> <p>Here goes tab content</p> &l

如何在Razor中将一段Html呈现为变量? 在Spark中,我曾编写以下代码:

<content var="t">
    <a class="tab" href="">Tab name</a>
</content>

<content var="tc">
    <div class="tabcontent">
        <p>Here goes tab content</p>
    </div>
</content>

!{tabs(t, tc)}

这里是标签内容

!{tabs(t,tc)}
两个变量被传递到一个宏,该宏将内容很好地包装到选项卡工作表中

在剃须刀里做同样事情的最好方法是什么

更新:我想我明白了

在Razor中,
@…
构造可以由用户生成lambda表达式,以后可以重用,这是一个扩展的等价物,相当于将一段HTML分配给一个变量。上述示例可通过以下方式实现:

Func<int, object> t =
    @<text>
        <a class="tab" href="">Tab name</a>
    </text>;

Func<int, object> tc =
    @<text>
        <div class="tabcontent">
            <p>Here goes tab content</p>
        </div>
    </text>;


@tabs(t(0), tc(0))
函数=
@
;
Func tc=
@
这里是标签内容

; @制表符(t(0)、tc(0))

我就是不知道如何编写无参数lambda(
Func
)。上面两个lambda中的
int
参数都是伪参数。Razor似乎需要一个参数(并且已经在表达式中创建了一个变量“item”来表示它)。

也许您可以使用HtmlString?我想我不太喜欢这个,但这里是我想尝试的,作为你所拥有的准确翻译

@{
    var t = new HtmlString("<a class='tab' href=''>Tab name</a>");
    var tc = new HtmlString("<div class='tabcontent'><p>Here goes tab content</p></div>");
}
@tabs(t, tc)

为了防止其他人发现这篇文章(和我一样),安迪的更新几乎就在那里。除了给出的示例之外,在给出的示例中,访问“int”所需做的就是引用
@item
。在
@
块中,变量
包含调用它的模型

下面是一个如何使用它的示例:

@model PageData

@{
    Func<Customer, object> sayHi = 
        @<text>
             <li>Hello @(item.FirstName)!</li>
         </text>;
}

<ul>
    @foreach(var customer in Model.Customers)
    {
        sayHi(customer);
    }
</ul>
@model PageData
@{
Func sayHi=
@
  • 你好@(item.FirstName)
  • ; }
      @foreach(Model.Customers中的var客户) { 沙伊希(客户); }

    在大多数情况下,您可能应该使用局部视图,而不是像这样的函数。但在极少数情况下,不可能进行局部查看(例如使用RazorEngine库时),这是可行的。

    基本上,OP已经解决了这个问题,您可以执行以下操作:

    @helper Tabs(string tabName, string tabContent)
    {
        <!-- some wrapper code -->   
        <a class="tab" href="">@(tabName)</a>
        <!-- some more wrapper code -->
        <div class="tabcontent">
            <p>@(tabContent)</p>
        </div>
        <!-- still more wrapper code -->
    }
    
    @{
       Func<dynamic, object> a = @<text>
           Some Text        
       </text>;
       @a(new object())
    }    
    
    @{
    Func a=@
    一些文本
    ;
    @a(新对象())
    }    
    
    如果文本仅用于一行,您甚至可以使用“@:”运算符,只需在下一行使用分号(或者如果需要任何右括号或括号),如下例所示:

    @{
       Func<dynamic, object> a = @: Some Text
       ;    
       @a(new object())
    }
    
    @{
    Func a=@:一些文本
    ;    
    @a(新对象())
    }
    
    但是,如果需要,可以直接将其捕获为字符串

    @{
        string a = ((Func<dynamic, object>)(@<text>
                        Some Text
                    </text>))("").ToString();
        @a //Output directly as a string        
    }
    
    @{
    字符串a=((Func)(@
    一些文本
    ))(“”)ToString();
    @直接作为字符串的//输出
    }
    
    您甚至可以将其封装在函数中:

    @functions{
         public string ToString(Func<dynamic, object> input)
         {
              return input("").ToString();
         }
    }
    
    @{
        string a = ToString(@<text>
                        Some Text
                   </text>);
        @a //Output directly as a string        
     }
    
    @函数{
    公共字符串到字符串(Func输入)
    {
    返回输入(“”.ToString();
    }
    }
    @{
    字符串a=ToString(@
    一些文本
    );
    @直接作为字符串的//输出
    }
    
    如果Razor视图中有IHtmlContentBuilder,则可以使用这些扩展

        public static IHtmlContentBuilder AppendRazor(this IHtmlContentBuilder htmlContentBuilder, Func<IHtmlContent, dynamic> lamda)
        {
            var html = lamda(null);
            return htmlContentBuilder.AppendHtml(html);
        }
    
        public static IHtmlContentBuilder AppendRazor<T>(this IHtmlContentBuilder htmlContentBuilder, Func<T, IHtmlContent> lamda, T model)
        {
            var html = lamda(model);
            return htmlContentBuilder.AppendHtml(html);
        }
    
    public static IHtmlContentBuilder AppendRazor(此IHtmlContentBuilder htmlContentBuilder,Func lamda)
    {
    var html=lamda(空);
    返回htmlContentBuilder.AppendHtml(html);
    }
    公共静态IHtmlContentBuilder(此IHtmlContentBuilder htmlContentBuilder,Func lamda,T型)
    {
    var html=lamda(模型);
    返回htmlContentBuilder.AppendHtml(html);
    }
    
    用法

    @{
    HtmlContentBuilder contentBuilder=新的HtmlContentBuilder();
    contentBuilder.AppendRazor(@Hello@Model.Name);
    contentBuilder.AppendRazor(@Hello@item.CustomerName,customer);
    }
    @内容生成器
    
    谢谢,我想我真正需要的是内联帮助器语法。我不知道这在Razor里有没有。解决方法是声明一个显式的helper,它可以被调用,结果可以被分配到一个变量中。语法可用,不需要显式帮助程序。可以改用Lambda表达式。请参阅我的最新问题。
        public static IHtmlContentBuilder AppendRazor(this IHtmlContentBuilder htmlContentBuilder, Func<IHtmlContent, dynamic> lamda)
        {
            var html = lamda(null);
            return htmlContentBuilder.AppendHtml(html);
        }
    
        public static IHtmlContentBuilder AppendRazor<T>(this IHtmlContentBuilder htmlContentBuilder, Func<T, IHtmlContent> lamda, T model)
        {
            var html = lamda(model);
            return htmlContentBuilder.AppendHtml(html);
        }
    
    @{
        HtmlContentBuilder contentBuilder = new HtmlContentBuilder();
        contentBuilder.AppendRazor(@<text><p>Hello @Model.Name<p></text>);
        contentBuilder.AppendRazor(@<text><p>Hello @item.CustomerName<p></text>, customer);
    }
    <div>
         @contentBuilder
    </div>