2009-08-04 10 views
6

Si je code dans une vue ASP.NET MVC qui ressemble à ceci:Quelle est la portée d'une variable dans une vue?

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

et plus tard en bas de la page, je crée un autre script dans un autre code bloc <% %> rends, je peux réutiliser la variable admin et faut-il se souvenir de l'état de plus haut dans la page, ou est la portée juste à l'intérieur des blocs <% %>?

Répondre

6

Les variables ont une portée normale dans une vue, bien qu'elles puissent être confuses avec les variables. Pensez à l'ensemble de la vue comme une méthode unique avec tout en dehors des balises (et les balises elles-mêmes) en tant qu'espace. Une variable définie en dehors d'un bloc dans la vue sera étendue à l'ensemble de la vue. Une variable définie à l'intérieur d'un bloc (foreach loop/if then/using) sera étendue à ce bloc. Vous ne pouvez pas réutiliser une variable dans un bloc précédemment défini en dehors du bloc.

7

Voici ce que je remarqué au sujet MVC Portée:

Une variable déclarée dans un contrôle du contenu que dans le scope Content Control:

<%@ 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> 

** Dans une vue page sans MasterPage , les variables déclarées dans un contrôle runat = "server" ne sont disponibles que dans ce contrôle. Les variables déclarées en dehors du contrôle runat = "server" ne sont pas disponibles pour ce contrôle.

Dans le cas contraire, des variables déclarées sont disponibles dans toute la page **

<%@ 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> 

code du contrôleur, en cas curieux:.

publique ActionResult scopeTest() { retour View(); }

public ActionResult ScopeTest2() 
{ 

    ViewData["VDScope"] = "ViewDataScope"; 

    return View(); 
} 
+0

* Les variables déclarées en dehors de la runat = contrôle « serveur » ne sont pas disponibles à ce contrôle. * Je ne pouvais pas comprendre pourquoi une seule référence de 5 sur ma page CONFORME A moi une erreur, ne s'est pas rendu compte que c'était le cas. – yoozer8

3

essayer

de script runat = type "serveur" = "text/C#" ici votre chaîne déclare varibale nompage = "YourPageName"; scénario

accéder puis dans tous ContentPlaceHolderID

+0

Cela fonctionne très bien pour les variables qui doivent être accessibles à plusieurs contrôles de contenu. –

Questions connexes