【发布时间】:2011-09-25 19:05:21
【问题描述】:
我需要创建一个仅在一个 cshtml 文件中需要的函数。您可以将我的情况视为 ASP.NET 页面方法,它们是在页面中实现的最小 Web 服务,因为它们的范围仅限于一页。我知道 HTML 助手(扩展方法),但我的函数只需要在一个 cshtml 文件中。我不知道如何在视图中创建函数签名。 注意:我使用的是 Razor 模板引擎。
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 razor
我需要创建一个仅在一个 cshtml 文件中需要的函数。您可以将我的情况视为 ASP.NET 页面方法,它们是在页面中实现的最小 Web 服务,因为它们的范围仅限于一页。我知道 HTML 助手(扩展方法),但我的函数只需要在一个 cshtml 文件中。我不知道如何在视图中创建函数签名。 注意:我使用的是 Razor 模板引擎。
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 razor
【讨论】:
您可以使用@helper Razor 指令:
@helper WelcomeMessage(string username)
{
<p>Welcome, @username.</p>
}
然后你像这样调用它:
@WelcomeMessage("John Smith")
【讨论】:
@functions方法里面,所以我喜欢这个答案。
如果您的方法不必返回 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)
【讨论】:
为什么不在 cshtml 文件中声明该函数?
@functions{
public string GetSomeString(){
return string.Empty;
}
}
<h2>index</h2>
@GetSomeString()
【讨论】:
functions 解决方案为她的返回类型提供了更多的灵活性。这两个答案在我的书中都得到了 +1,因为它们都是有用的信息花絮。
<p>Welcome, @username.</p> 与 return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");。
@helper 并不能使其可用于其他视图。我更喜欢@helper 的原因是您可以将 html 放在花括号之间。 @functions 不会(轻易)让你这样做。
@helper 和 @functions 都可以在多个视图之间共享,并且都可以在单个视图中声明和使用(我个人发现它们在共享/单一场景)。恕我直言,它们之间唯一的实际区别是视图助手添加了句法糖以返回呈现的 HTML sn-ps(或者,更合适的是HelperResult 实例),而视图函数通常只是对于返回简单的引用或值类型很有用。
如果您想访问页面的全局变量,可以这样做:
@{
ViewData["Title"] = "Home Page";
var LoadingButtons = Model.ToDictionary(person => person, person => false);
string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}
【讨论】:
GetLoadingState() 这里是本地函数。
在 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>
【讨论】: