Jak zdefiniować metodę w Razor?


Odpowiedzi:


310

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.

}

16
+1 dzięki, FYI nazywa się praktycznością. MVC nie jest jedyną grą w mieście. Niektórzy ludzie lubią proste maszynki do golenia i URLRewrite, ponieważ MVC ma wiele do zrobienia bez większych korzyści IMO
Jason Sebring

5
@functionsjest dobrym miejscem do organizowania wyświetlania określonego kodu generowania.
Przykład

1
cześć David, jak mogę zdefiniować funkcję w jednym pliku i użyć jej w innym pliku?
Georgi Kovachev

Georgi, nazywa się to „Razor HTML Helper”. Zasadniczo, klasa zdefiniowana w twoim folderze Code, z zestawem metod statycznych, jak sugerowano tutaj: asp.net/mvc/overview/older-versions-1/views/…
jeanie77

Georgi, być może już się z tym spotkałeś ... ale do ponownego użycia <code> @functions </code> lub <code> @helper </code> opcji Razor możesz użyć pliku takiego jak Shared.cshtml w App_Code teczka. Tam możesz zdefiniować <code> @functions {} </code> lub <code> @helper MyFunction () {} </code> i używać ich w innych szablonach Razor, takich jak <code> @ Shared.MyFunction () < / code> gdzie nazwa pliku jest podobna do „przestrzeni nazw”
Jamie Altizer

194

Masz na myśli pomocnika?

@helper SayHello(string name)
{
    <div>Hello @name</div>
}

@SayHello("John")

4
Chcę zdefiniować metodę, która nie zwraca MvcHtmlString, ale typ C #.
Rookian

4
@Rookian, dlaczego miałbyś kiedykolwiek pisać kod C # w widoku? Mam na myśli, że metody pisania w widoku są po prostu złe! Możesz doskonale napisać kod C # gdziekolwiek należy, a następnie wywołać metodę w widoku Razor, i właśnie to robią pomocnicy HTML. I nie powinny zwracać zawsze MvcHtmlString.
Darin Dimitrov

1
@Rookian, może mógłbyś w pierwszej kolejności wyjaśnić, co próbujesz zrobić. Cokolwiek to jest, jestem pewien, że jest lepszy sposób na zrobienie tego niż pisanie kodu C # w widoku :-)
Darin Dimitrov

1
To jest niesamowite! Dziękuję Darin ... kiedy myślę, że wiem wszystko o MVC, przychodzisz i uczę się czegoś nowego :)
Serj Sagan

3
Odpowiednikiem ASP.NET Core jest Tag Helper: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
beercohol

34

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ć helperró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.


2
Wywoływanie funkcji przez pominięcie @Functionsprzedrostka, jak @OrderedList(...)działa dla mnie w .netcore.
Muflix,

12

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>

10

Razor to tylko szablonowy silnik.

Powinieneś stworzyć regularną klasę.

Jeśli chcesz stworzyć metodę na stronie Razor, umieść ją w @functionsbloku .


1

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>

0

Możesz także użyć @{ }bloku do tworzenia funkcji:

@{
    async Task<string> MyAsyncString(string input)
    {
        return Task.FromResult(input);
    }
}

Następnie na stronie maszynki do golenia:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>

0

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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.