Come definisco un metodo in Razor?
Risposte:
Lasciando da solo qualsiasi dibattito su quando (se mai) dovrebbe essere fatto, @functions è come lo fai.
@functions {
// Add code here.
}
@functions
è un buon posto per organizzare la visualizzazione del codice di generazione specifico . Caso in questione: quei brutti modelli client-da-stringhe ..
Intendi helper in linea?
@helper SayHello(string name)
{
<div>Hello @name</div>
}
@SayHello("John")
È molto semplice definire una funzione all'interno di razor.
@functions {
public static HtmlString OrderedList(IEnumerable<string> items)
{ }
}
Quindi puoi chiamare una funzione ovunque. Piace
@Functions.OrderedList(new[] { "Blue", "Red", "Green" })
Tuttavia, questo stesso lavoro può essere svolto helper
anche attraverso . Come esempio
@helper OrderedList(IEnumerable<string> items){
<ol>
@foreach(var item in items){
<li>@item</li>
}
</ol>
}
Allora qual è la differenza? Secondo questo post precedente, sia @helpers che @functions condividono una cosa in comune: rendono il riutilizzo del codice una possibilità all'interno delle pagine Web. Condividono anche un'altra cosa in comune: a prima vista sembrano uguali, il che potrebbe causare un po 'di confusione sui loro ruoli. Tuttavia, non sono la stessa cosa. In sostanza, un helper è uno snippet riutilizzabile di Razor sytnax esposto come metodo ed è inteso per il rendering di HTML nel browser, mentre una funzione è un metodo di utilità statico che può essere chiamato da qualsiasi punto all'interno dell'applicazione Web Pages. Il tipo restituito per un helper è sempre HelperResult, mentre il tipo restituito per una funzione è qualunque cosa tu voglia che sia.
@Functions
prefisso come @OrderedList(...)
funziona per me in .netcore.
Potresti anche farlo con una Func come questa
@{
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 è solo un motore di creazione di modelli.
Dovresti creare una classe normale.
Se vuoi creare un metodo all'interno di una pagina Razor, inseriscili in un @functions
blocco .
Puoi semplicemente dichiararli come funzioni locali in un blocco rasoio (cioè @{}
).
@{
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>