我需要创建一个仅在一个 cshtml 文件中使用的函数。您可以将我的情况看作是 ASP.NET 页面方法,它们是在页面中实现的最小 Web 服务,因为它们仅适用于一个页面。我知道 HTML 帮助程序(扩展方法),但我的函数仅在一个 cshtml 文件中需要。我不知道如何在视图中创建函数签名。 注意:我正在使用 Razor 模板引擎。
我需要创建一个仅在一个 cshtml 文件中使用的函数。您可以将我的情况看作是 ASP.NET 页面方法,它们是在页面中实现的最小 Web 服务,因为它们仅适用于一个页面。我知道 HTML 帮助程序(扩展方法),但我的函数仅在一个 cshtml 文件中需要。我不知道如何在视图中创建函数签名。 注意:我正在使用 Razor 模板引擎。
@functions{
public string GetSomeString(){
return string.Empty;
}
}
<h2>index</h2>
@GetSomeString()
<p>Welcome, @username.</p>
,而使用函数则需要这样写return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");
。 - Daniel Liuzzi@helper
并不会使其在其他视图中可用。我更喜欢@helper
的原因是你可以在花括号之间放置HTML代码,而@functions
则无法(轻松地)实现这一点。 - jfren484@helper
和@functions
都可以在多个视图之间共享,也可以在单个视图中声明并使用(我个人在共享和单独场景中都发现了它们的用途)。在我看来,它们之间唯一的实际区别在于,视图助手为返回呈现的HTML片段(或者更合适的是HelperResult
实例)添加语法糖,而视图函数通常仅对返回简单的引用或值类型有用。 - rsenna您可以使用@helper Razor指令:
@helper WelcomeMessage(string username)
{
<p>Welcome, @username.</p>
}
然后你可以这样调用它:
@WelcomeMessage("John Smith")
@functions
方法内部放置标记,因此我喜欢这个答案。 - jfren484如果你的方法不需要返回 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)
@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>
如果你想要访问页面的全局变量,可以这样做:
Original Answer翻译成“最初的回答”
@{
ViewData["Title"] = "Home Page";
var LoadingButtons = Model.ToDictionary(person => person, person => false);
string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}
GetLoadingState()
在此处是本地函数。 - Wolfrevok Cats