2009-08-04 11 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ループ/ if then/using)は、そのブロックにスコープされます。以前はブロック外で定義されていたブロック内で変数を再利用することはできません。ここで

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

が私のページ上5のただ一つの基準を与えていた理由を*にrunat =「サーバー」コントロールの外で宣言された変数は、その制御には使用できません。*私は把握できなかったにアクセス私は間違い、これが事実であることを認識しなかった。 – yoozer8

3

ここでこの

スクリプトにrunat = "サーバー" タイプ= "テキスト/ C#" 宣言あなたvaribale 文字列のページ名= "YourPageName" をしてみてください。 スクリプト

は、すべてのContentPlaceHolderID

+0

これは、複数のコンテンツコントロールにアクセスする必要がある変数に最適です。 –

関連する問題