我如何定义一个方法在剃刀?

我如何定义一个方法在剃刀?

118141 次浏览

你是说内联helper?

@helper SayHello(string name)
{
<div>Hello @name</div>
}


@SayHello("John")

撇开任何关于何时(如果有的话)应该做的争论不谈,@functions是你如何做的。

@functions {


// Add code here.


}

Razor只是一个模板引擎。

您应该创建一个常规类。

如果你想在Razor页面中创建一个方法,把它们放在@functions中。

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

在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都有一个共同点——它们使代码在Web页面中重用成为可能。他们还有一个共同点——第一眼看起来都一样,这可能会让他们的角色有点混淆。然而,它们并不相同。从本质上讲,helper是作为方法公开的Razor语法的可重用片段,用于向浏览器呈现HTML,而函数是静态实用程序方法,可以从Web Pages应用程序中的任何地方调用。helper的返回类型总是HelperResult,而函数的返回类型是您想要的任何类型。

你也可以只使用@{ }块来创建函数:

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

Index.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块中。方法应该返回 如果需要异步处理,则为Task:

@{
void Template(string[] listItems, string style)
{
<ul>
@foreach (var listItem in listItems)
{
<li class="@style">@listItem</li>
}
</ul>
}
}