2009-08-04 36 views
6

如果我有代碼看起來像這樣的一個ASP.NET MVC視圖中:什麼是視圖內的變量的範圍?

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

,後來下來,我裏面創建另一個代碼另一個腳本的頁面渲染塊<% %>,我可以重用admin變量,將它請記住頁面中較高的狀態,還是僅在<% %>塊內的範圍?

回答

6

變量的作用域通常在視圖中顯示,儘管它可能會讓標記混淆。把整個視圖看作一個單一的方法,將標籤外的所有內容(和標籤本身)都視爲空白。在視圖中的塊外定義的變量將被限定在整個視圖中。一個塊內定義的變量(foreach循環/如果然後/使用)將被限定在該塊中。您不能在塊之前在塊之外定義的塊內重用變量。

7

這是我注意到關於MVC範圍:

在內容控制聲明的變量只在內容控制作用域:

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

**在查看頁面沒有母版,在runat =「server」控件中聲明的變量僅在該控件中可用。在runat =「server」控件外部聲明的變量不適用於該控件。

否則,聲明的變量是整個頁面提供**

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

控制器代碼,以防好奇:

公衆的ActionResult ScopeTest(){ 回報 視圖(); }

public ActionResult ScopeTest2() 
{ 

    ViewData["VDScope"] = "ViewDataScope"; 

    return View(); 
} 
+0

*的RUNAT =「服務器」控制之外聲明的變量是不可用於控制。*我無法弄清楚,爲什麼5我的網頁上的只是一個參考是給訪問我錯了,沒有意識到這是事實。 – yoozer8 2014-03-25 17:46:26

3

試試這個

腳本RUNAT = 「服務器」 類型= 「文本/ C#」 這裏宣佈你varibale 字符串頁面名稱= 「YourPageName」; 腳本

然後在所有ContentPlaceHolderID

+0

這對於需要可供多個內容控件訪問的變量非常適用。 – 2016-04-07 20:30:44