2009-08-04 16 views
6

अगर मैं एक ASP.NET MVC का मानना ​​है कि इस तरह दिखता है अंदर कोड है:दृश्य के अंदर एक चर का दायरा क्या है?

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

और बाद में पृष्ठ मैं एक कोड के अंदर एक और स्क्रिप्ट बनाने के नीचे ब्लॉक <% %> प्रस्तुत करना, मैं पुन: उपयोग कर सकते हैं admin चर और कहीं भी होगी राज्य को पृष्ठ में उच्च से याद रखें, या <% %> ब्लॉक के अंदर दायरा है?

उत्तर

6

वैरिएबल सामान्य रूप से एक दृश्य में स्कॉप्ड होते हैं, हालांकि यह टैग के साथ भ्रमित हो सकता है। पूरे दृश्य को टैग के बाहर सबकुछ (और खुद टैग) के साथ एक विधि के रूप में सोचें। दृश्य में एक ब्लॉक के बाहर परिभाषित एक चर को पूरे दृश्य में स्कॉप्ड किया जाएगा। एक ब्लॉक के अंदर परिभाषित एक चर (फोरैच लूप/यदि तब/उपयोग कर रहा है) उस ब्लॉक पर स्कॉप्ड किया जाएगा। आप उस ब्लॉक के अंदर एक चर का पुन: उपयोग नहीं कर सकते जिसे पहले ब्लॉक के बाहर परिभाषित किया गया था।

7

यहाँ मैं क्या के बारे में MVC स्कोप देखा है:

एक चर एक सामग्री नियंत्रण में घोषित केवल सामग्री नियंत्रण के भीतर दायरे वाला: एक masterpage बिना

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

नियंत्रक संहिता, मामले उत्सुक में:।

public ActionResult ScopeTest() { वापसी देखें(); }

public ActionResult ScopeTest2() 
{ 

    ViewData["VDScope"] = "ViewDataScope"; 

    return View(); 
} 
+0

* चर runat = "सर्वर" नियंत्रण से बाहर घोषणा की है कि नियंत्रण करने के लिए उपलब्ध नहीं हैं। * मैं समझ नहीं सकता है क्यों अपने पन्ने पर 5 में से केवल एक संदर्भ दे रहा था का उपयोग मुझे एक त्रुटि, यह नहीं पता था कि यह मामला था। – yoozer8

3

इस

स्क्रिप्ट runat = "सर्वर" प्रकार की कोशिश = "text/सी #" यहाँ varibale स्ट्रिंग पृष्ठ का नाम दिखना = "YourPageName" की घोषणा; स्क्रिप्ट

तो सारे ContentPlaceHolderID

+0

यह चर के लिए बहुत अच्छा काम करता है जिसे एकाधिक सामग्री नियंत्रणों तक पहुंचने की आवश्यकता होती है। –

संबंधित मुद्दे