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

Sae*_*ati 206 asp.net-mvc razor asp.net-mvc-3

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

小智 393

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

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

<h2>index</h2>
@GetSomeString()
Run Code Online (Sandbox Code Playgroud)

  • 这应该标记为答案,因为@functions指令特别符合OP要求.Helpers功能旨在通过将带有@helper指令的文件放入App_Code目录中来跨多个模板文件共享使用.而@functions指令允许函数仅由声明它的模板使用. (32认同)
  • 但是,在单个视图中使用`@helper`并不能使其可用于其他视图.我更喜欢@helper的原因是你可以在你的花括号之间添加html.`@ functions`没有(轻松)让你这样做. (9认同)
  • @AaronLS公平地说,帮助者不会返回字符串而是返回IHtmlString,它会为您处理HTML编码并保护您的应用免受XSS攻击.帮助程序还为您提供了帮助程序本身的Razor语法的便利,您将失去功能.换句话说,`<p> Welcome,@ username.</ p>`与`return new HtmlString("<p> Welcome,"+ Html.Encode(username)+".</ p>");`. (8认同)
  • 另请注意,助手似乎面向返回字符串,就像其他剃刀助手一样,因此`functions`解决方案为toher返回类型提供了更大的灵活性.我的书中的两个答案都得到+1,因为它们都是有用的信息花絮. (7认同)
  • 只是为了记录:`@helper`和`@function`都可以在许多视图之间共享,并且两者都可以被单个视图声明并使用(我个人发现在共享/单个场景中都使用它们) .恕我直言,它们之间唯一的实际区别在于视图助手为返回呈现的HTML片段(或者更合适的是,"HelperResult"实例)添加语法糖,而视图函数*通常*仅对返回简单引用或值有用类型. (5认同)

Dan*_*zzi 270

您可以使用@helper Razor指令:

@helper WelcomeMessage(string username)
{
    <p>Welcome, @username.</p>
}
Run Code Online (Sandbox Code Playgroud)

然后你像这样调用它:

@WelcomeMessage("John Smith")
Run Code Online (Sandbox Code Playgroud)

  • 你不能把标签放在`@function`方法里面,所以我喜欢这个答案. (13认同)
  • @MuM6oJuM6o 不,不是。您可以找到本文中列出的替代方案 [ASP.NET Core 中的 Helper 发生了什么?](https://www.mikesdotnetting.com/article/344/what-happened-to-helpers-in-asp-net-core ) (3认同)
  • 但你不能返回变量(因此单词功能) (2认同)
  • asp.net核心也支持@helper吗? (2认同)

Muh*_*han 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)
Run Code Online (Sandbox Code Playgroud)

  • 它有效,但它远非简单.我的圣书是简单的;).但是,谢谢你提供替代品. (2认同)

Pet*_*ník 7

在 ASP.NET Core Razor Pages 中,您可以在函数中组合 C# 和 HTML:

@model PagerModel
@{
}

@functions 
{
    void PagerNumber(int pageNumber, int currentPage)
    {
        if (pageNumber == currentPage)
        {
            <span class="page-number-current">@pageNumber</span>
        }
        else
        {
            <a class="page-number-other" href="/table/@pageNumber">@pageNumber</a>
        }
    }
}

<p>@PagerNumber(1,2) @PagerNumber(2,2) @PagerNumber(3,2)</p>
Run Code Online (Sandbox Code Playgroud)