2012-12-20 6 views
38

Chociaż patrząc na temat Pobrałem z galerii Orchard CMS, zauważyłem, że Layout.cshtml plik miał ten blok kodu na początku pliku:Co robi blok kodu @functions w pliku brzytwy i kiedy (jeśli w ogóle) powinienem go użyć?

@functions { 
// To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following. 
string CalcuClassify(string[] zoneNames, string classNamePrefix) 
{ 
    var zoneCounter = 0; 
    var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray()); 
    return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : ""; 
} 
} 

wiem, co robi zadeklarowana funkcja (oblicza, które strefy są wypełnione w celu zwrócenia szerokości każdej kolumny), moje pytanie brzmi: jakie jest prawidłowe użycie bloku @function i kiedy powinienem go użyć?

+0

Osobiście uważam, że należy tego unikać, ponieważ po prostu mętnieje wody w warstwie prezentacji/widoku i jaki jest kontroler biznesowy/warstwa. – Liam

+12

@Liam - Nie zgadzam się. Myślę, że powinien on być wyraźnie użyty do celów * unikania * mącenia wód. W tym przykładzie służy do określania szerokości kolumny, o czym kontroler nie powinien nawet wiedzieć. – Bobson

+1

@bobson point taken – Liam

Odpowiedz

52

Blok @functions umożliwia zdefiniowanie funkcji użytkowych bezpośrednio w widoku, zamiast dodawać je jako rozszerzenia pomocnika @Html lub informowanie kontrolera o właściwościach wyświetlania. Zechcesz z niego skorzystać, gdy spełnisz następujące warunki:

  1. Funkcjonalność jest ściśle powiązana z widokiem i ogólnie nie jest przydatna w innych miejscach (np. "Jak szerokie są moje kolumny").
  2. Ta funkcjonalność jest czymś więcej niż prostą instrukcją if i/lub jest używana w wielu miejscach w widoku.
  3. Wszystko, co funkcja potrzebuje do określenia swojej logiki, już istnieje w widoku Model.

Jeśli nie powiedzie się pierwsza, dodaj ją jako pomocnika @Html.

Jeśli nie uda ci się wykonać drugiego, po prostu wpisz to.

Jeśli nie powiedzie się trzecia, należy wykonać obliczenia w kontrolerze i przekazać wynik jako część modelu.

+0

+1. To jest świetna odpowiedź. Istnieje przypadek użycia '@ funkcji', ale niezbyt często! –

+1

Świetna odpowiedź, zwłaszcza część dotycząca wyjaśnienia alternatyw, które powinieneś zastosować: D –

+0

Dobra odpowiedź, dzięki –

0

Od msdn blogs, @functions blok to niech pan zawinąć kod wielokrotnego użytku, jak metod i właściwości

0

W tym konkretnym przypadku, ludzie, którzy stworzyli kompozycję używasz zapewne starali się zachować jest to prosty motyw (tylko widoki, css i obrazy).

Jeśli potrzebujesz napisać jakiś kod do motywu dla Orchard, musisz przejść do modułu (jak tutaj: http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme), chyba że napiszesz ten kod w widoku.

Nie jestem pewien, czy warto poświęcić czas na przejście z tematu na moduł, aby uzyskać rozmiar kolumny.

6

Inni wyjaśnili, co robi @functions, więc tego nie powtórzę. Ale chciałbym dodać to:

Jeśli twój widok jest wpisany w viewmodel, myślę, że realną opcją byłoby przeniesienie tej logiki do viewmodelu, aby uniknąć zaśmiecania znaczników zbyt dużą ilością kodu. W przeciwnym razie twoje poglądy zaczynają wyglądać bardziej jak klasyczne ASP i nie sądzę, żeby ktokolwiek tego chciał.

Nie sądzę, że jest coś złego w korzystaniu z widoku @functions lub @helper, ale gdy pojawi się więcej niż kilka metod w widoku, lub nawet jeśli funkcja jest nieco skomplikowana, może warto refactoring do viewmodel, jeśli to w ogóle możliwe. Jeśli jest to kod, który można ponownie wykorzystać, dobrym pomysłem może być wyciągnięcie go do klasy pomocniczej lub rozszerzenia do klasy HtmlHelper. Jedną z rzeczy, która jest złym pomysłem, jest uświadomienie sobie, że po prostu przepisałeś kawałek kodu, który już istniał, ponieważ nie wiedziałeś, że został ukryty w jakimś arbitralnym widoku.

Powiązane problemy