2010-11-28 92 views
14

如何将一段Html渲染成Razor中的变量? 火花我以前写下面的代码:剃刀 - 如何将内容渲染到变量中

<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)} 

两个变量获取传递到执行内容进入标签纸的所有漂亮包装的宏。

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

更新:我想我它..

在剃刀中,@<text>...</text>构建体可以是用户产生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)) 

我只是无法弄清楚如何写参数的lambda表达式(Func<object>)。上述两个lambda中的int参数都是虚拟的。 Razor似乎需要一个参数(并且已经在表达式中创建了一个变量“item”来表示它)。

回答

5

也许你可以使用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) 

所以...我不知道你的星火宏是什么样子,但它似乎是一个在剃刀中使用帮手的机会。你可能会碰到这样的:

@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 --> 
} 

然后调用,从你的页面,如下所示:

@Tabs("Tab Name", "Here goes tab content") 
+0

感谢,我想我真正需要的是一个内联帮手语法。我不知道这在剃刀中是否可用。解决方案将是声明一个显式的帮助器,可以调用该帮助器,并将结果分配给一个变量。 – Andy 2010-12-29 18:04:13

+0

我在上面的评论中错了。语法可用,不需要显式帮助器。可以使用Lambda表达式来代替。看到我更新的问题。 – Andy 2010-12-30 15:31:41

5

万一别人发现这个职位(像我一样),安迪的更新几乎是有。除了给出的例子之外,在给出的例子中,你所要做的只是访问'int',它是参考文献@item。在@<text></text>块中,变量item包含它被调用的模型。

下面是它如何被使用的例子:

@model PageData 

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

<ul> 
    @foreach(var customer in Model.Customers) 
    { 
     sayHi(customer); 
    } 
</ul> 

在大多数情况下,你应该使用的,而不是像这样的功能的局部视图。但在罕见的情况下,部分视图是不可能的(例如使用RazorEngine库时),这是有效的。

7

基本上OP已经回答了,你可以做类似的问题:

@{ 
    Func<dynamic, object> a = @<text> 
     Some Text   
    </text>; 
    @a(new object()) 
}  

如果文本是单行只有你甚至可以用“@:”操作符,只是remmebr有分号(或者如果它需要任何结束括号或括号)下一行,如下面的例子:

@{ 
    Func<dynamic, object> a = @: Some Text 
    ;  
    @a(new object()) 
} 

但是你可以直接捕捉到它作为一个字符串,如果你想

@{ 
    string a = ((Func<dynamic, object>)(@<text> 
        Some Text 
       </text>))("").ToString(); 
    @a //Output directly as a string   
} 

你甚至可以将其封装在一个函数:

@functions{ 
    public string ToString(Func<dynamic, object> input) 
    { 
      return input("").ToString(); 
    } 
} 

@{ 
    string a = ToString(@<text> 
        Some Text 
       </text>); 
    @a //Output directly as a string   
} 
0

如果您在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); 
    } 

使用

​​