Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在cshtml模板中创建函数?_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc 如何在cshtml模板中创建函数?

Asp.net mvc 如何在cshtml模板中创建函数?,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我需要创建一个只在一个cshtml文件中需要的函数。您可以将我的情况视为ASP.NET页面方法,它们是在一个页面中实现的最小web服务,因为它们的作用域是一个页面。我知道HTML助手(扩展方法),但我的函数只需要在一个cshtml文件中使用。我不知道如何在视图中创建函数签名。 注意:我正在使用Razor模板引擎。查看一下您可以使用@helper Razor指令: @helper WelcomeMessage(string username) { <p>Welcome, @us

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

查看一下

您可以使用@helper Razor指令:

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

如果您的方法不必返回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)
@{
ViewBag.Title=“Index”;
Layout=“~/Views/Shared/_Layout.cshtml”;
Func Sum=(a,b)=>a+b;
}
指数
@总和(3,4)

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

@functions{
    public string GetSomeString(){
        return string.Empty;
    }
}

<h2>index</h2>
@GetSomeString()
@函数{
公共字符串GetSomeString(){
返回字符串。空;
}
}
指数
@GetSomeString()

如果要访问页面的全局变量,可以执行以下操作:

@{
    ViewData["Title"] = "Home Page";

    var LoadingButtons = Model.ToDictionary(person => person, person => false);

    string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}

在ASP.NET Core Razor页面中,您可以在函数中组合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>
@model PagerModel
@{
}
@功能
{
无效页码(整数页码,整数当前页)
{
如果(页码==当前页)
{
@页码
}
其他的
{
}
}
}
@PagerNumber(1,2)@PagerNumber(2,2)@PagerNumber(3,2)


它是可行的,但远不是简单的。我的圣书是简单;)。但感谢您提供的替代方案。如果您需要在函数中访问页面的全局变量,这很有用,还有其他方法吗/这应标记为答案,因为@functions指令特别满足OP要求。Helpers功能旨在通过将带有@helper指令的文件放入App_代码目录,跨多个模板文件共享使用。然而,@functions指令允许函数仅由声明它的模板使用。还要注意的是,帮助程序似乎像其他razor帮助程序一样面向返回字符串,因此
函数
解决方案为其返回类型提供了更大的灵活性。在我的书中,这两个答案都是+1,因为它们都是有用的信息。@AaronLS公平地说,帮助程序不返回字符串,而是返回IHtmlString,它为您处理HTML编码并保护您的应用程序免受XSS攻击。Helpers还为您提供了helper本身的Razor语法的便利,这在函数中会丢失。换句话说,
欢迎,@username.

返回新的HtmlString(欢迎,“+Html.Encode(username)+”

”)相比。但是,在单个视图中使用
@helper
并不能使其对其他视图可用。我之所以更喜欢@helper,是因为你可以在花括号之间插入html
@functions
不(容易)让你这么做。仅供记录:
@helper
@functions
都可以在多个视图中共享,并且都可以在单个视图中声明和使用(我个人发现它们在两个共享/单个场景中都有用处)。它们之间唯一的实际区别是视图帮助器为返回呈现的HTML片段(或者更合适的是,
HelperResult
实例)添加了语法糖,视图函数通常只用于返回简单的引用或值类型。您不能在
@functions
方法中放置标记,因此我喜欢这个答案。是的,这比声明函数要好得多。更直截了当的是。但是你不能返回变量(因此单词function)asp.net内核是否也支持@helper?@MuM6oJuM6o不,它不支持。您可以找到本文中列出的备选方案,因为C#7.0是唯一正确的答案<代码>GetLoadingState()
这里是本地函数。另请参见
@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>