2009-08-04 46 views
6

Nếu tôi có code bên trong một cái nhìn ASP.NET MVC trông như thế này:Phạm vi của một biến trong chế độ xem là gì?

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

và sau đó xuống trang tôi tạo ra một kịch bản bên trong mã khác làm cho khối <% %>, tôi có thể tái sử dụng các biến admin và sẽ nó nhớ trạng thái từ cao hơn trong trang, hoặc là phạm vi ngay bên trong các khối <% %>?

Trả lời

6

Các biến số được sắp xếp bình thường trong một khung nhìn, mặc dù nó có thể gây nhầm lẫn với các thẻ. Hãy nghĩ về toàn bộ khung nhìn như là một phương thức duy nhất với mọi thứ bên ngoài các thẻ (và các thẻ của chúng) như là khoảng trắng. Một biến được định nghĩa bên ngoài một khối trong khung nhìn sẽ được đưa vào toàn bộ khung nhìn. Một biến được xác định bên trong một khối (vòng lặp foreach/nếu sau đó/sử dụng) sẽ được đưa vào khối đó. Bạn không thể sử dụng lại biến trong một khối trước đó đã được xác định bên ngoài khối.

7

Đây là những gì tôi nhận thấy về MVC Phạm vi:

Biến khai báo trong một kiểm soát nội dung được scoped chỉ trong Control Nội dung:

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

** Trong một Xem trang mà không có một MasterPage , các biến được khai báo trong điều khiển runat = "server" chỉ khả dụng trong điều khiển đó. Các biến được khai báo bên ngoài điều khiển runat = "server" không có sẵn cho điều khiển đó.

Nếu không, công bố các biến có sẵn trên khắp trang **

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

điều khiển Mã, trong trường hợp tò mò:.

public ActionResult ScopeTest() { trở View(); }

public ActionResult ScopeTest2() 
{ 

    ViewData["VDScope"] = "ViewDataScope"; 

    return View(); 
} 
+0

* Biến tuyên bố bên ngoài runat = kiểm soát "máy chủ" không có sẵn để kiểm soát đó. * Tôi không thể tìm ra lý do tại sao chỉ là một tài liệu tham khảo của 5 trên trang của mình được đưa ra cho tôi một lỗi, đã không nhận ra đây là trường hợp. – yoozer8

3

thử

script runat = "server" kiểu này = "text/C#" tuyên bố đây bạn varibale chuỗi pagename = "YourPageName"; kịch bản

sau đó truy cập vào tất cả các ContentPlaceHolderID

+0

Điều này phù hợp với các biến cần phải truy cập được đối với nhiều điều khiển Nội dung. –

Các vấn đề liên quan