Jak zadeklarować zmienną lokalną w Razor?

354

Tworzę aplikację internetową w asp.net mvc 3. Jestem bardzo nowy. W widoku z użyciem brzytwy chciałbym zadeklarować niektóre zmienne lokalne i używać ich na całej stronie. Jak można to zrobić?

Wydaje się dość trywialne, aby móc wykonać następujące czynności:

@bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);
@if (isUserConnected)
{ // meaning that the viewing user has not been saved
    <div>
        <div> click to join us </div>
        <a id="login" href="javascript:void(0);" style="display: inline; ">join</a>
    </div>
}

Ale to nie działa. czy to możliwe?

Vondip
źródło

Odpowiedzi:

521

Myślę, że byłeś bardzo blisko, spróbuj tego:

@{bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);}
@if (isUserConnected)
{ // meaning that the viewing user has not been saved so continue
    <div>
        <div> click to join us </div>
        <a id="login" href="javascript:void(0);" style="display: inline; ">join here</a>
    </div>
}
Tomas Jansson
źródło
o rany, próbowałem wszystkich możliwych prac, ale to. Dzięki Tomas!
vondip
Jak to zrobić w VB.NET?
Stefan Paul Noack
7
och, sam to odkryłem: @Code .. End Codezamiast@{ .. }
Stefan Paul Noack
1
@ Abhijeet.Nagre, w pytaniu, które pisze: @bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);ale definicja zmiennej musi znajdować się w „bloku kodu”. Nie potrafię udzielić lepszej odpowiedzi na pytanie, dlaczego tak jest, tak po prostu działa brzytwa.
Tomas Jansson
2
@AbhijeetNagre - Razor jest zazwyczaj dość dobry w zrozumieniu, gdzie zaczyna się i kończy kod, ale nie jest idealny. Czasami musimy po prostu dać małą wskazówkę dotyczącą tego, co należy traktować jako Razor / C #, a co nie. Jeśli kiedykolwiek pojawi się błąd Razor, dodanie { }tagów jest zwykle pierwszym krokiem
Jon Story,
50

Myślę, że zmienna powinna znajdować się w tym samym bloku:

@{bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);
    if (isUserConnected)
    { // meaning that the viewing user has not been saved
        <div>
            <div> click to join us </div>
            <a id="login" href="javascript:void(0);" style="display: inline; ">join</a>
        </div>
    }
    }
Khasha
źródło
Wydaje się, że tak jest, przynajmniej w MVC3.
Matthew Walton
1
Świetny! Masz pomysł, jak ponownie użyć tej zmiennej w isUserConnecteddalszej części strony?
SharpC
@SharpC Po zadeklarowaniu takiej zmiennej jest ona dostępna w pozostałej części tego pliku .cshtml. Później w pliku możesz zrobić coś podobnego @if (isUserConnected) { /* stuff if connected */ }lub <div>Connected? @isUserConnected</div>(działa to lepiej z łańcuchami). Nie jest on jednak dostępny poza tym plikiem (np. Będziesz musiał zadeklarować go osobno w częściach).
Dan Mangiarelli
18

Możesz także użyć:

@if(string.IsNullOrEmpty(Model.CreatorFullName))
{
...your code...
}

Nie ma potrzeby zmiennej w kodzie

marcel
źródło
6
To nie daje odpowiedzi na pytanie.
Owen Pauling,
13

Jeśli szukasz zmiennej int, która zwiększa się w miarę zapętlania się kodu, możesz użyć czegoś takiego:

@{
  int counter = 1;

  foreach (var item in Model.Stuff) {
    ... some code ...
    counter = counter + 1;
  }
} 
Brian
źródło
12

Nie jest to bezpośrednia odpowiedź na problem OP, ale może ci również pomóc. Możesz bez problemu zadeklarować zmienną lokalną obok jakiegoś html w zakresie.

@foreach (var item in Model.Stuff)
{
    var file = item.MoreStuff.FirstOrDefault();

    <li><a href="@item.Source">@file.Name</a></li>
}
aloisdg przechodzi na codidact.com
źródło
tego szukałem, dziękuję !!
Ninjanoel,
2

aby zadeklarować, że zmienna ma być dostępna na całej stronie. Na górze strony zwykle działa. Domniemany lub jawnie twój wybór.

          @{
               //implicit
               var something1 = "something";
               //explicit
               string something2 = "something";
          }


            @something1 //to display on the page
            @something2 //to display on the page
d384
źródło
1

możesz umieścić wszystko w bloku i łatwo napisać dowolny kod, który chcesz w tym bloku, dokładnie taki kod:

@{
        bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);
        if (isUserConnected)
        { // meaning that the viewing user has not been saved
            <div>
                <div> click to join us </div>
                <a id="login" href="javascript:void(0);" style="display: inline; ">join</a>
            </div>
        }
    }

pomaga mieć na początku czystszy kod, a także można zapobiec ładowaniu strony wiele razy różnych bloków kodów

sajadre
źródło