如何在 Razor 中定义方法?
你的意思是内联助手?
@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>
}
那么区别是什么呢??根据前面的post,@helpers 和@functions 确实有一个共同点——它们使代码在网页中重用成为可能。他们还有一个共同点——乍一看他们看起来一样,这可能会导致他们的角色有点混乱。但是,它们并不相同。从本质上讲,帮助程序是作为方法公开的 Razor sytnax 的可重用片段,旨在将 HTML 呈现给浏览器,而函数是可以从网页应用程序中的任何位置调用的静态实用程序方法。帮助器的返回类型始终是 HelperResult,而函数的返回类型是您想要的任何类型。
@Functions
前缀作为 @OrderedList(...)
来调用函数对我在 .netcore 中有效。
你也可以用这样的 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>
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;
}
}
下面是列表助手在 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>
}
}
@functions
是组织查看特定生成代码的好地方。恰当的例子:那些丑陋的客户端模板-来自-字符串..@functions
或@helper
Razor 选项,您可以在 App_Code 中使用 Shared.cshtml 等文件文件夹。在那里您可以定义@functions {}
或@helper MyFunction() {}
并在您的其他 Razor 模板中使用它们,例如@Shared.MyFunction()< /code> 其中文件名类似于“命名空间”