2009-08-04 8 views
6

Wenn ich Code in einer ASP.NET MVC-Ansicht haben, die wie folgt aussieht:Was ist der Gültigkeitsbereich von Variablen in einer Ansicht?

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

und später auf der Seite, die ich ein anderes Skript in einem anderen Code zu erstellen machen Block <% %>, kann wiederverwendet werden ich die admin variabel und wird es Erinnere dich an den Zustand von oben auf der Seite, oder ist der Bereich nur innerhalb der <% %> Blöcke?

Antwort

6

Variablen werden normalerweise in einer Ansicht definiert, obwohl sie mit den Tags verwechselt werden kann. Stellen Sie sich die gesamte Ansicht als eine einzige Methode vor, bei der alles außerhalb der Tags (und der Tags selbst) als Leerzeichen dargestellt wird. Eine außerhalb eines Blocks in der Ansicht definierte Variable wird auf die gesamte Ansicht beschränkt. Eine in einem Block definierte Variable (foreach loop/if then/using) wird auf diesen Block beschränkt. Sie können eine Variable nicht innerhalb eines Blocks wiederverwenden, der zuvor außerhalb des Blocks definiert wurde. Hier

7

ist, was ich in Bezug auf MVC Scope bemerkt:

Eine Variable in einem Content Control erklärt nur innerhalb des Content Control scoped ist:

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

** in einer Ansicht Seite ohne Master Variablen, die in einem runat = "server" -Steuerelement deklariert sind, sind nur in diesem Steuerelement verfügbar. Variablen, die außerhalb des Steuerelements runat = "server" deklariert sind, sind für dieses Steuerelement nicht verfügbar.

Andernfalls deklarierten Variablen in der gesamten Seite verfügbar sind **

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

-Controller-Code, falls neugierig.

public Actionscopetest() { return View(); }

public ActionResult ScopeTest2() 
{ 

    ViewData["VDScope"] = "ViewDataScope"; 

    return View(); 
} 
+0

* Variablen außerhalb des runat = „server“ Steuerung erklärt sind, dass die Steuerung nicht zur Verfügung. * Ich konnte nicht herausfinden, warum nur eine Referenz des 5 auf meiner Seite gab mir ein Fehler, wusste nicht, dass das der Fall war. – yoozer8

3

versuchen, diese

script runat = "server" type = "text/C#" erklären hier Ihre Varibale String lan = "YourPageName"; Skript

Zugriff dann in allen ContentPlaceHolderID

+0

Dies funktioniert hervorragend für Variablen, die für mehrere Inhaltssteuerelemente zugänglich sein müssen. –

Verwandte Themen