ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Razor 中定义方法?

如何在 Razor 中定义方法?

对于那些想看看有什么选择的人:有两种方法可以做到。一。使用“@function”,另一个使用“@helper”。它们之间的区别在这里得到了很好的解释。 mikesdotnetting.com/article/173/…

P
PTD

更不用说关于何时(如果有的话)应该完成的任何争论,@functions 就是你如何做到的。

@functions {

    // Add code here.

}

+1 谢谢,仅供参考,它被称为实用性。 MVC 并不是镇上唯一的游戏。有些人喜欢简单的剃须刀和 URLRewrite,因为 MVC 要做很多事情,但对 IMO 的好处很少
@functions 是组织查看特定生成代码的好地方。恰当的例子:那些丑陋的客户端模板-来自-字符串..
嗨大卫,我怎样才能在一个文件中定义函数并在另一个文件中使用它?
Georgi,这被称为“Razor HTML Helper”。基本上,在您的代码文件夹中定义的一个类,具有一组静态方法,如下所示:asp.net/mvc/overview/older-versions-1/views/…
Georgi,您现在可能已经遇到过这种情况...但是要重用 @functions@helper Razor 选项,您可以在 App_Code 中使用 Shared.cshtml 等文件文件夹。在那里您可以定义 @functions {}@helper MyFunction() {} 并在您的其他 Razor 模板中使用它们,例如 @Shared.MyFunction()< /code> 其中文件名类似于“命名空间”
D
Darin Dimitrov

你的意思是内联助手?

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

@SayHello("John")

我想定义一个方法,它返回的不是 MvcHtmlString,而是 C# 类型。
@Rookian,您为什么需要在视图中编写 C# 代码?我的意思是在视图中编写方法是错误的!您可以完美地编写您的 C# 代码,然后在 Razor 视图中调用该方法,这正是 HTML 助手所做的。而且它们不应该总是返回一个 MvcHtmlString。
@Rookian,也许您可以首先解释一下您要做什么。不管它是什么,我确信有更好的方法来做到这一点,而不是在视图中编写 C# 代码:-)
似乎不再支持 ASP.NET Core。语法错误。
与 ASP.NET Core 等效的是 Tag Helper:docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
g
gdmanandamohon

在 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 中有效。
B
Bokoskokos

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

S
SLaks

Razor 只是一个模板引擎。

您应该创建一个常规类。

如果要在 Razor 页面中创建方法,请将它们放在 @functions block 中。


D
Daniel

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

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

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

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

V
Valdemar Vreeman

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

M
M.Ali El-Sayed

下面是列表助手在 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>
    }
}