如何在cshtml模板中创建函数?


219

我需要创建一个仅在一个cshtml文件中必需的函数。您可以将我的情况视为ASP.NET页面方法,这是在页面中实现的最小Web服务,因为它们的作用域是一个页面。我知道HTML帮助器(扩展方法),但是我的功能只需要一个cshtml文件。我不知道如何在视图内创建函数签名。 注意:我正在使用Razor模板引擎。

Answers:


279

您可以使用@helper Razor指令:

@helper WelcomeMessage(string username)
{
    <p>Welcome, @username.</p>
}

然后像这样调用它:

@WelcomeMessage("John Smith")

13
您不能将标签放在@functions方法中,所以我喜欢这个答案。
jfren484 2013年

1
是的,这比声明函数要好得多。更直接。
muglio 2015年

2
但是您不能返回变量(因此使用单词函数)
Paul

@保罗,我不明白你的意思。
Daniel Liuzzi

2
asp.net核心也支持@helper吗?
MuM6oJuM6o

411

为什么不只在cshtml文件中声明该函数?

@functions{
    public string GetSomeString(){
        return string.Empty;
    }
}

<h2>index</h2>
@GetSomeString()

32
这应该标记为答案,因为@functions指令专门满足OP要求。通过将带有@helper指令的文件放入App_Code目录中,可以将Helpers功能用于多个模板文件的共享使用。而@functions指令则允许函数仅由声明该函数的模板使用。
乔恩·戴维斯

7
还要注意,就像其他剃刀助手一样,助手似乎也functions倾向于返回字符串,因此该解决方案为返回类型提供了更大的灵活性。尽管这两个答案都是有用的信息,但它们在我的书中都得到了+1。
AaronLS 2011年

8
@AaronLS公平地说,助手不会返回字符串,而是返回IHtmlString,它会为您处理HTML编码并保护您的应用程序免受XSS攻击。辅助函数还为您提供了Razor语法的便捷性,而函数本身却给您带来了便利。换句话说,<p>Welcome, @username.</p>return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");
Daniel Liuzzi 2012年

9
但是,@helper在单个视图中使用并不会使其对其他视图可用。我更喜欢@helper的原因是您可以将HTML放在花括号之间。 @functions不会(轻松)让您这样做。
jfren484 2013年

5
只是为了记录:双方@helper@functions可以在多个视图之间共享,既可以声明为通过一个单一的视图中使用(我个人发现在这两个共享/单场景使用了它们)。恕我直言,它们之间唯一的实际区别是视图助手添加了语法糖来返回渲染的HTML代码段(或更合适的是HelperResult实例),而视图函数通常仅对返回简单的引用或值类型有用。
rsenna 2014年

25

如果您的方法不必返回html并且必须执行其他操作,则可以在Razor中使用lambda而不是helper方法

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Func<int,int,int> Sum = (a, b) => a + b;
}

<h2>Index</h2>

@Sum(3,4)

3
它可以工作,但远非简单。我的圣书是简单;)。但是,谢谢您提供替代方法。
Saeed Neamati 2011年

这很有用,但是如果您需要在函数中访问页面的全局变量,还有其他方法吗?:/
Alexandre Daubricourt


1

如果要访问页面的全局变量,可以执行以下操作:

@{
    ViewData["Title"] = "Home Page";

    var LoadingButtons = Model.ToDictionary(person => person, person => false);

    string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}

从C#7.0开始,这是唯一正确且正确的答案。GetLoadingState()这是局部函数。
Wolfrevo猫
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.