如何在 Razor 中定义方法?
抛开关于何时(如果有的话)应该完成的任何争论,@functions就是你如何做到这一点。
@functions {
// Add code here.
}
你是说内联助手吗?
@helper SayHello(string name)
{
<div>Hello @name</div>
}
@SayHello("John")
在 razor 中定义函数非常简单。
@functions {
public static HtmlString OrderedList(IEnumerable<string> items)
{ }
}
所以你可以在任何地方调用该函数。喜欢
@Functions.OrderedList(new[] { "Blue", "Red", "Green" })
但是,同样的工作也可以通过
helper
完成。举个例子
@helper OrderedList(IEnumerable<string> items){
<ol>
@foreach(var item in items){
<li>@item</li>
}
</ol>
}
那么有什么区别呢?根据这篇文章:
@helpers 和 @functions 确实有一个共同点 - 它们使代码在网页中重用成为可能。他们还有另一个共同点——乍一看他们看起来很相似,这可能会导致他们的角色有点混乱。然而,它们并不相同。本质上,助手是作为方法公开的 Razor sytnax 的可重用片段,用于将 HTML 呈现到浏览器,而函数是静态实用方法,可以从网页应用程序中的任何位置调用。助手的返回类型始终是 HelperResult,而函数的返回类型是您想要的任何类型。
你也可以用这样的 Func 来做到这一点
@{
var getStyle = new Func<int, int, string>((width, margin) => string.Format("width: {0}px; margin: {1}px;", width, margin));
}
<div style="@getStyle(50, 2)"></div>
您也可以仅使用
@{ }
块来创建函数:
@{
async Task<string> MyAsyncString(string input)
{
return Task.FromResult(input);
}
}
然后在您的剃须刀页面中:
<div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>
以下是 ASP.NET Core 3 中列表助手的编写方式
您现在可以像以前一样将 HTML 标记包含在代码块中声明为本地方法的方法主体中,或者包含在 @functions 块中。该方法应该返回 void,或者 Task(如果需要异步处理):
@{
void Template(string[] listItems, string style)
{
<ul>
@foreach (var listItem in listItems)
{
<li class="@style">@listItem</li>
}
</ul>
}
}
MyModelVm.cs
public class MyModelVm
{
public HttpStatusCode StatusCode { get; set; }
}
索引.cshtml
@model MyNamespace.MyModelVm
@functions
{
string GetErrorMessage()
{
var isNotFound = Model.StatusCode == HttpStatusCode.NotFound;
string errorMessage;
if (isNotFound)
{
errorMessage = Resources.NotFoundMessage;
}
else
{
errorMessage = Resources.GeneralErrorMessage
}
return errorMessage;
}
}
<div>
@GetErrorMessage()
</div>
您还可以使用下面的代码块。它更干净并且具有更多功能。您还可以在上面插入变量,在下面插入函数。而不是使用 2 个单独的代码块。
@{
string exampleVariable = "just an example variable";
string anotherExampleVariable = "just another example variable";
string GetErrorMessage()
{
var isNotFound = Model.StatusCode == HttpStatusCode.NotFound;
string errorMessage;
if (isNotFound)
{
errorMessage = Resources.NotFoundMessage;
}
else
{
errorMessage = Resources.GeneralErrorMessage
}
return errorMessage;
}
}