【问题标题】:How do I define a method in Razor?如何在 Razor 中定义方法?
【发布时间】:2011-07-06 19:16:21
【问题描述】:

如何在 Razor 中定义方法?

【问题讨论】:

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

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


【解决方案1】:

不管何时(如果有的话)应该做任何争论,@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() 文件名类似于“命名空间”的地方
【解决方案2】:

你是说内联助手?

@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/…
【解决方案3】:

在 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 的可重用 sn-p,旨在将 HTML 呈现给浏览器,而函数是可以从网页应用程序中的任何位置调用的静态实用程序方法。帮助器的返回类型始终是 HelperResult,而函数的返回类型是您想要的任何类型。

【讨论】:

  • 通过省略@Functions 前缀作为@OrderedList(...) 调用函数在.netcore 中为我工作。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    Razor 只是一个模板引擎。

    您应该创建一个常规类。

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

    【讨论】:

      【解决方案6】:

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

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

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-29
            • 1970-01-01
            • 2015-12-14
            • 2015-04-24
            • 1970-01-01
            • 1970-01-01
            • 2022-12-03
            • 2021-11-27
            相关资源
            最近更新 更多