如何在Razor中定义方法?


Answers:


310

@functions不用讨论何时应该(如果有的话)应该做的任何争论。

@functions {

    // Add code here.

}

16
+1感谢,仅供参考。MVC不是唯一的游戏。有些人就像简单的剃刀和URLRewrite为MVC是很多小的利益做IMO
贾森赛百灵

5
@functions是组织查看特定生成代码的好地方。
恰当的

1
大卫,您好,我如何在一个文件中定义函数,然后在另一个文件中使用它?
Georgi Kovachev

Georgi,这被称为“ Razor HTML Helper”。基本上,这是在您的代码文件夹中定义的类,带有此处建议的一组静态方法:asp.net/mvc/overview/older-versions-1/views/…–
jeanie77

Georgi,您现在可能已经碰到了这个问题……但是要重用<code> @functions </ code>或<code> @helper </ code> Razor选项,您可以在App_Code中使用诸如Shared.cshtml之类的文件夹。您可以在其中定义<code> @functions {} </ code>或<code> @helper MyFunction(){} </ code>,并在其他Razor模板中使用它们,例如<code> @ Shared.MyFunction()< /代码>其中的文件的名称是如“命名空间”
杰米Altizer

194

你是说内联助手?

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

@SayHello("John")

4
我想定义一个不返回MvcHtmlString而是C#类型的方法。
Rookian 2011年

4
@Rookian,为什么还要在视图中编写C#代码?我的意思是在视图中编写方法是错误的!您可以完美地编写C#代码,无论它属于哪个位置,然后在Razor视图中调用该方法,而这正是HTML帮助程序所做的。而且他们不应该总是返回MvcHtmlString。
Darin Dimitrov'3

1
@Rookian,也许您可​​以首先解释您要做什么。无论是什么,我都相信有比在视图中编写C#代码更好的方法了:-)
Darin Dimitrov

1
这太棒了!谢谢达林...当我想我对MVC有所了解时,您来了,我学到了一些新的东西:)
Serj Sagan


34

在剃刀内部定义功能非常简单。

@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页面中重用。他们也有其他共同点-乍一看它们看起来是一样的,这可能会使他们的角色有些混乱。但是,它们并不相同。本质上,辅助程序是作为一种方法公开的Razor sytnax的可重用代码段,旨在将HTML呈现给浏览器,而功能是可以从您的Web页应用程序中的任何位置调用的静态实用程序方法。助手的返回类型始终是HelperResult,而函数的返回类型则是您想要的任何类型。


2
在.netcore中,通过省略@Functions前缀来调用函数@OrderedList(...)
Muflix

12

您也可以使用像这样的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页面中创建方法,请将其放在@functions块中


1

您只需在剃刀块(即)中将它们声明为局部函数即可@{}

@{
    int Add(int x, int y)
    {
        return x + y;
    }
}

<div class="container">
    <p>
        @Add(2, 5)
    </p>
</div>

0

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

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

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

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

0

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.