TOC

This article is currently in the process of being translated into Chinese (~87% done).

Razor:

Local Functions

在前面的文章中,我们讲了如何在如何在你的视图中定义一个代码块,像下面这样:

@{
    // C# code goes here...
    // As many lines as you want!
}

你可以使用这些代码块来完成几乎C#可以做的所有事情——你甚至可以定义本地方法! 这真是太酷了,因为本地的Razor方法使你能够包含前端标记,这也就使创建一些小型的模板方法成为可能。这在许多情况下都是很有用的,例如我们在本文接下来的例子中,我们要生成几次相同的前端标记。声明一个本地方法就像声明一个类方法,不同的是本地方法没有访问修饰符(public, private 等等)。例子如下所示:

@{
    void RenderUserInfo(HelloMVCWorld.Models.WebUser user)
    {
<div class="user-info">
    @user.LastName, @user.FirstName [@user.Birthday.ToShortDateString()]
</div>
    }
}

注意到Razor中,在HTML前端标记中混合使用C#代码有多优雅了吗?下面这个例子中,我们故意把前端标记写得很简单。但这并不代表它只能实现这种非常简单的功能,你可以按需把它写得很复杂。

下面的例子展示了如何定义与使用该本地方法:

@model List<HelloMVCWorld.Models.WebUser>
@{
    ViewData["Title"] = "Functions";
}

<h1>Functions</h1>

@{
    void RenderUserInfo(HelloMVCWorld.Models.WebUser user)
    {
<div class="user-info">
    @user.LastName, @user.FirstName [@user.Birthday.ToShortDateString()]
</div>
    }

    <h2>Users [sorted by first name]</h2>
    foreach(var user in Model.OrderBy(x => x.FirstName))
    {
RenderUserInfo(user);
    }

    <h2>Users [sorted by last name]</h2>
    foreach(var user in Model.OrderBy(x => x.LastName))
    {
RenderUserInfo(user);
    }
}

多亏了这个本地方法(RenderUserInfo 方法),我们现在可以将相同的列表以不同的排序方式打印两次了,而无需手写两次相同的前端代码。

带返回值的本地方法

你注意到了RenderUserInfo()方法没返回任何东西(因为它已经显示地将void作为返回值了),但方法也可以不以void为返回值。你所定义的本地Razor方法可以简单地返回值,就像常规的C#方法那样。这在某些情况下是很有用的,例如当你想在代码的不同位置做一种复杂的计算时。下面是一个例子:

@{ 
    int GetTheAnswerToLifeTheUniverseEverything(int x, int y)
    {
return x * y;
    }
}
<div>
    The answer to life, the universe and everything: @GetTheAnswerToLifeTheUniverseEverything(7, 6)
</div>

很显然,这是个非常愚蠢的例子。通常情况下,方法可以做出比一个简单的乘法运算更有趣的事情。但为了描绘定义和使用一个带返回值的本地方法是多么的容易,我们不得不举此例。输出结果看起来像这样:

<div>
    The answer to life, the universe and everything: 42
</div>

总结

本地Razor方法使你能够很容易地定义在当前视图中可用地方法,例如,多次执行相同的动作或将方法用作模板。


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!