如何在 Razor 中定义方法?

问题描述 投票:0回答:8

如何在 Razor 中定义方法?

c# asp.net-mvc asp.net-mvc-3 razor
8个回答
359
投票

抛开关于何时(如果有的话)应该完成的任何争论,@functions就是你如何做到这一点。

@functions {

    // Add code here.

}

220
投票

你是说内联助手吗?

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

@SayHello("John")

56
投票

在 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,而函数的返回类型是您想要的任何类型。


14
投票

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

10
投票

Razor 只是一个模板引擎。

您应该创建一个常规课程。

如果您想在 Razor 页面内创建方法,请将它们放入

@functions
中。


3
投票

您也可以仅使用

@{ }
块来创建函数:

@{
    async Task<string> MyAsyncString(string input)
    {
        return Task.FromResult(input);
    }
}

然后在您的剃须刀页面中:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>

3
投票

以下是 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>
    }
}

1
投票

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.