2009-08-04 61 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