Odpowiedzi:
Pozostawiając w spokoju wszelkie debaty, kiedy (jeśli w ogóle) należy to zrobić, @functions to sposób, w jaki to robisz.
@functions {
// Add code here.
}
@functions
jest dobrym miejscem do organizowania wyświetlania określonego kodu generowania.
Masz na myśli pomocnika?
@helper SayHello(string name)
{
<div>Hello @name</div>
}
@SayHello("John")
Zdefiniowanie funkcji w maszynce do golenia jest bardzo proste.
@functions {
public static HtmlString OrderedList(IEnumerable<string> items)
{ }
}
Możesz więc wywołać funkcję w dowolnym miejscu. Lubić
@Functions.OrderedList(new[] { "Blue", "Red", "Green" })
Tę samą pracę można jednak wykonać helper
również. Jako przykład
@helper OrderedList(IEnumerable<string> items){
<ol>
@foreach(var item in items){
<li>@item</li>
}
</ol>
}
Jaka jest różnica? Zgodnie z tym poprzednim postem zarówno @helpers, jak i @funkcje mają jedną wspólną cechę - umożliwiają ponowne użycie kodu na stronach internetowych. Łączy ich też jeszcze jedna wspólna cecha - na pierwszy rzut oka wyglądają tak samo, co może powodować zamieszanie w ich rolach. Jednak nie są takie same. Zasadniczo pomocnik to fragment kodu Razor sytnax, który jest udostępniany jako metoda i jest przeznaczony do renderowania HTML w przeglądarce, podczas gdy funkcja jest statyczną metodą narzędziową, którą można wywołać z dowolnego miejsca w aplikacji Web Pages. Typem zwracanym dla pomocnika jest zawsze HelperResult, natomiast typem zwracanym dla funkcji jest to, co chcesz.
@Functions
przedrostka, jak @OrderedList(...)
działa dla mnie w .netcore.
Możesz to również zrobić za pomocą takiego Func
@{
var getStyle = new Func<int, int, string>((width, margin) => string.Format("width: {0}px; margin: {1}px;", width, margin));
}
<div style="@getStyle(50, 2)"></div>
Razor to tylko szablonowy silnik.
Powinieneś stworzyć regularną klasę.
Jeśli chcesz stworzyć metodę na stronie Razor, umieść ją w @functions
bloku .
Możesz po prostu zadeklarować je jako funkcje lokalne w bloku żyletki (tj @{}
.).
@{
int Add(int x, int y)
{
return x + y;
}
}
<div class="container">
<p>
@Add(2, 5)
</p>
</div>
MyModelVm.cs
public class MyModelVm
{
public HttpStatusCode StatusCode { get; set; }
}
Index.cshtml
@model MyNamespace.MyModelVm
@functions
{
string GetErrorMessage()
{
var isNotFound = Model.StatusCode == HttpStatusCode.NotFound;
string errorMessage;
if (isNotFound)
{
errorMessage = Resources.NotFoundMessage;
}
else
{
errorMessage = Resources.GeneralErrorMessage
}
return errorMessage;
}
}
<div>
@GetErrorMessage()
</div>