【问题标题】:How to create a function in a cshtml template?如何在 cshtml 模板中创建函数?
【发布时间】:2011-09-25 19:05:21
【问题描述】:

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

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

【讨论】:

    【解决方案2】:

    您可以使用@helper Razor 指令:

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

    然后你像这样调用它:

    @WelcomeMessage("John Smith")
    

    【讨论】:

    • 你不能把标签放在@functions方法里面,所以我喜欢这个答案。
    • 是的,这比声明一个函数要好得多。更直接。
    • 但是你不能返回变量(因此是函数这个词)
    • asp.net core 也支持@helper 吗?
    • @MuM6oJuM6o 不,它没有。您可以找到本文中列出的替代方案What Happened To Helper In ASP.NET Core?
    【解决方案3】:

    如果您的方法不必返回 html 并且必须执行其他操作,那么您可以在 Razor 中使用 lambda 代替辅助方法

    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    
        Func<int,int,int> Sum = (a, b) => a + b;
    }
    
    <h2>Index</h2>
    
    @Sum(3,4)
    

    【讨论】:

    • 它有效,但远非简单。我的圣书很简单;)。但感谢您提供替代方案。
    • 如果您需要在函数中访问页面的全局变量,这很有用,还有其他方法吗? ://
    【解决方案4】:

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

    @functions{
        public string GetSomeString(){
            return string.Empty;
        }
    }
    
    <h2>index</h2>
    @GetSomeString()
    

    【讨论】:

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

    如果您想访问页面的全局变量,可以这样做:

    @{
        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() 这里是本地函数。
    【解决方案6】:

    在 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2020-08-13
      相关资源
      最近更新 更多