2009-08-04 11 views
6

Si tengo código dentro de una vista ASP.NET MVC que tiene este aspecto:¿Cuál es el alcance de las variables dentro de una vista?

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

y más tarde por la página se crea otro script dentro de otro código de bloque rindo <% %>, se puede volver a usar la variable admin trabajo y no tengo ¿Recuerda el estado de más arriba en la página, o es el alcance dentro de los bloques <% %>?

Respuesta

6

Las variables se delimitan normalmente en una vista, aunque puede confundirlas con las etiquetas. Piense en la vista completa como un método único con todo lo que está fuera de las etiquetas (y las propias etiquetas) como espacios en blanco. Una variable definida fuera de un bloque en la vista tendrá un alcance para toda la vista. Una variable definida dentro de un bloque (bucle foreach/if then/using) tendrá un alcance en ese bloque. No puede reutilizar una variable dentro de un bloque que se haya definido previamente fuera del bloque.

7

Aquí es lo que he notado con respecto MVC Alcance:

Una variable declarada en un control de contenido está en el ámbito sólo dentro del control de contenido:

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

** En una vista de página sin MasterPage , las variables declaradas en un control runat = "server" solo están disponibles en ese control. Las variables declaradas fuera del control runat = "server" no están disponibles para ese control.

De lo contrario, declararon las variables están disponibles en toda la página **

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

código del controlador, en caso curioso:.

pública ActionResult scopeTest() { retorno Ver(); }

public ActionResult ScopeTest2() 
{ 

    ViewData["VDScope"] = "ViewDataScope"; 

    return View(); 
} 
+0

* Las variables declaradas fuera de la runat = Control "servidor" no están disponibles para ese control. * Yo no podía entender por qué sólo una referencia de la 5 en mi página estaba dando un error, no me di cuenta de que este era el caso. – yoozer8

3

probar este

guión runat = tipo "servidor" = "text/C#" declaran aquí el nombre de la página varibale cadena = "YourPageName"; guión

entonces acceso en todos los ContentPlaceHolderID

+0

Esto funciona muy bien para las variables que deben ser accesibles a múltiples controles de contenido. –

Cuestiones relacionadas