And*_*ndy 15 razor asp.net-mvc-3
如何在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)}
Run Code Online (Sandbox Code Playgroud)
两个变量被传递给一个宏,该宏将内容完美地包装到选项卡表中.
在Razor中做同样事情的最佳方法是什么?
更新:我想我明白了..
在Razor中,@<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))
Run Code Online (Sandbox Code Playgroud)
我只是想不通如何编写无参数lambdas(Func<object>).int上面两个lambda中的参数都是虚拟的.Razor似乎需要一个参数(并且已经创建了一个变量"item"来表示它在表达式中).
基本上OP已经回答了问题,因为你可以做类似的事情:
@{
Func<dynamic, object> a = @<text>
Some Text
</text>;
@a(new object())
}
Run Code Online (Sandbox Code Playgroud)
如果文本仅用于单行,您甚至可以使用"@:"运算符,只需在下一行中使用分号(或者如果需要任何右括号或括号),如下例所示:
@{
Func<dynamic, object> a = @: Some Text
;
@a(new object())
}
Run Code Online (Sandbox Code Playgroud)
但是,如果需要,您可以直接将其捕获为字符串
@{
string a = ((Func<dynamic, object>)(@<text>
Some Text
</text>))("").ToString();
@a //Output directly as a string
}
Run Code Online (Sandbox Code Playgroud)
你甚至可以将它封装在一个函数中:
@functions{
public string ToString(Func<dynamic, object> input)
{
return input("").ToString();
}
}
@{
string a = ToString(@<text>
Some Text
</text>);
@a //Output directly as a string
}
Run Code Online (Sandbox Code Playgroud)
为了防止其他人发现这篇文章(正如我所做的那样),安迪的更新几乎就在那里.除了给出的示例之外,在给出的示例中访问'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>
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,您应该使用局部视图而不是像这样的函数.但是在极少数情况下无法使用局部视图(例如使用RazorEngine库时),这是有效的.
也许你可以使用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)
Run Code Online (Sandbox Code Playgroud)
所以...我不知道你的Spark宏看起来像什么,但似乎是在Razor中使用帮助器的机会.你可能有类似的东西:
@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 -->
}
Run Code Online (Sandbox Code Playgroud)
然后你在你的页面中调用它,如下所示:
@Tabs("Tab Name", "Here goes tab content")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16481 次 |
| 最近记录: |