我需要创建一个仅在一个cshtml文件中必需的函数。您可以将我的情况视为ASP.NET页面方法,这是在页面中实现的最小Web服务,因为它们的作用域是一个页面。我知道HTML帮助器(扩展方法),但是我的功能只需要一个cshtml文件。我不知道如何在视图内创建函数签名。 注意:我正在使用Razor模板引擎。
我需要创建一个仅在一个cshtml文件中必需的函数。您可以将我的情况视为ASP.NET页面方法,这是在页面中实现的最小Web服务,因为它们的作用域是一个页面。我知道HTML帮助器(扩展方法),但是我的功能只需要一个cshtml文件。我不知道如何在视图内创建函数签名。 注意:我正在使用Razor模板引擎。
Answers:
您可以使用@helper Razor指令:
@helper WelcomeMessage(string username)
{
<p>Welcome, @username.</p>
}
然后像这样调用它:
@WelcomeMessage("John Smith")
为什么不只在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代码段(或更合适的是HelperResult
实例),而视图函数通常仅对返回简单的引用或值类型有用。
如果您的方法不必返回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)
如果要访问页面的全局变量,可以执行以下操作:
@{
ViewData["Title"] = "Home Page";
var LoadingButtons = Model.ToDictionary(person => person, person => false);
string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}
GetLoadingState()
这是局部函数。
@functions
方法中,所以我喜欢这个答案。