2009-08-04 23 views
6

Jeśli mam kodu wewnątrz widoku ASP.NET MVC, który wygląda tak:Jaki jest zakres zmiennych w widoku?

<% 
    bool admin = false; 
    if (ViewData.ContainsKey("isAdmin")) 
    { 
     admin = (bool)ViewData["isAdmin"]; 
    } 
    if (admin) 
    { 
%> 
<%-- 
    ... generate table of html 
--%> 

a później w dół strony tworzę inny skrypt wewnątrz innego kodu czynią blok <% %>, mogę ponownie użyć zmiennej admin i będzie pamiętasz stan z wyższej strony, czy też zakres znajduje się wewnątrz bloków <% %>?

Odpowiedz

6

Zmienne są zwykle określane w widoku, chociaż może się to mylić z tagami. Pomyśl o całym widoku jako jednej metodzie, a wszystko poza znacznikami (i same znaczniki) jako białe znaki. Zmienna zdefiniowana poza blokiem w widoku będzie obejmowała cały widok. Zmienna zdefiniowana w bloku (pętla foreach/jeśli to jest/używa) będzie objęta tym blokiem. Nie można ponownie użyć zmiennej wewnątrz bloku, który został wcześniej zdefiniowany poza blokiem.

7

Oto co zauważyłem dotyczące MVC zakres:

Zmienna zadeklarowana w Content Control jest zawężona tylko w ramach kontroli treści:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    ScopeTest 
    <% 
     string testVar1 = "This is a test."; 
    %> 
    <%= 
    testVar1 
    %> 

</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>ScopeTest</h2> 
The below reference to the testVar1 will cause a parser error, because the variable is out of scope. 
<%=testVar1 %> 
</asp:Content> 

** w widoku strony bez MasterPage , zmienne zadeklarowane w formancie runat = "server" są dostępne tylko w tej kontrolce. Zmienne zadeklarowane poza formantem runat = "server" nie są dostępne dla tej kontrolki.

W przeciwnym wypadku, oświadczył zmienne są dostępne w całej strony **

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 

<% 
    string strPageScope = "PageScope Variable."; 
    %> 

<head runat="server"> 

[HEAD]<br /> 
    <title>ScopeTest2</title> 
    <% 
     string strHeadScope = "Head Scope...";   
     %> 

     This WORKS: 
     <%= 
      strHeadScope %> 
      <br /> 


      ViewData available everywhere: 
      <%= 
        ViewData["VDScope"].ToString() 
       %> 

      <br /> 


      strPageScope is NOT Available BECAUSE THE RUNAT=SERVER: 
      <% 
       //Response.Write(strPageScope); 
       %> 

      <br /> 
      [END OF HEAD]<br /> 
</head> 
<body> 
[BODY START]<br /> 

    strHeadScope NOT AVAILABLE, BECAUSE THE HEAD HAS RUNAT="SERVER" IN IT. 
    <% 
     //Response.Write(strHeadScope); 
    %> 
<br /> 
ViewData is available everywhere: 
      <% 
        Response.Write( ViewData["VDScope"].ToString()); 
       %> 
      <br /> 

    <div> 
     <% 
      string strBodyVar = "Testing Var Declared in Body."; 
      %> 

    </div> 

     <% 

      Response.Write(strBodyVar); 

      %> 

      <br /> 

      Page Scope works: 
      <%= 
    strPageScope 
    %> 
    <br /> 
    [END BODY] 
</body> 
</html> 

kod kontrolera, w przypadku ciekawy.

publicznej ActionResult ScopeTest() { powrót View(); }

public ActionResult ScopeTest2() 
{ 

    ViewData["VDScope"] = "ViewDataScope"; 

    return View(); 
} 
+0

* Zmienne zadeklarowane poza runat = kontrola „server” nie są dostępne dla tej kontroli. * I nie mógł zrozumieć, dlaczego tylko jedno odniesienie do 5 na mojej stronie dawał mnie błąd, nie zdawałem sobie z tego sprawy. – yoozer8

3

spróbować tej

script runat = "server" type = "text/C#" zadeklarować tu swoją varibale ciąg nazwa strony = "YourPageName"; skrypt

następnie uzyskać dostęp do wszystkich ContentPlaceHolderID

+0

Działa to doskonale w przypadku zmiennych, które muszą być dostępne dla wielu elementów sterujących treścią. –

Powiązane problemy