代码之家  ›  专栏  ›  技术社区  ›  Hemant

ASP.NET MVC应用程序的aspx文件中的挂起代码是如何执行的?

  •  2
  • Hemant  · 技术社区  · 15 年前

    这个问题可能听起来很奇怪,但我发现了 真正地

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
    
    <asp:Content ID="aboutTitle" ContentPlaceHolderID="TitleContent" runat="server">
        About Us
    </asp:Content>
    
    <asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
        <h2>About</h2>
        <p>
    <%  var cookie = Request.Cookies["mvcData"];
        string lastRefreshValue = cookie == null? "Unknown": cookie["lastRefresh"];
    %>
    <%= Html.Encode ("Last Refreshed: " + lastRefreshValue) %>
    <%  var newCookie = new HttpCookie ("mvcData");
        newCookie["lastRefresh"] = DateTime.Now.ToString ();
        newCookie.Expires = DateTime.Now.AddSeconds (10);
        Response.Cookies.Add (newCookie);
    %>
    
            <%= Html.Encode (ViewState["hello"] ?? "") %>
        </p>
    </asp:Content>
    

    用<%…%编写的代码&燃气轮机;工作正常,正如预期的那样,但是我如何在一个 ? 当然,它是从ViewPage继承的,ViewPage是一个类,因此无论用<%…%编写什么代码&燃气轮机;确实从某个方法执行。对吗?

    . 我写它是为了测试cookies。关键是这段代码在类中是如何映射的?

    3 回复  |  直到 15 年前
        1
  •  2
  •   kastermester    15 年前

    当您创建ASP.Net MVC视图(页面)时,它从一个类继承,正如您所说的ViewPage,该类反过来从ASP.Net WebForms(System.Web.UI.Page)的页面类继承,并实现IViewDataContainer接口(从MVC)。

    总之,IHttpHandler有一个名为ProcessRequest的方法,该方法接受HttpContext实例。

    神奇,但你明白了)-这个类是新的(你的ViewPage),它有几个被调用的方法-一些连接母版页等等,其中一个会以某种方式读取.aspx页面,所有正常的输出都被包装在响应调用中。Write和其他将作为C#代码运行(并且,<%=…%>将转换为Response.Write调用)-我相信这种解析是通过正则表达式完成的。

    请注意,我不是这方面的专家,而且很可能在技术上是错误的(嘿,有人可以随意发表一个更好的回复,我试着给出一般性的理解),但它应该给出这方面的整体和一般性的理解。

    编辑:我还要补充一点,当您通过控制器类返回ViewResult时,它最终将调用一个方法(我相信它被称为Execute),该方法来自它继承的ActionResult类,然后将启动一个选择正确的ViewEngine的过程,默认的ViewEngine是WebForms one,这就需要整个过程,尤其是这些巨大的编辑混乱。

    @赫尔曼特的评论

    Response.Write("<html> ... <head> ...");
    

    每隔一段时间,您的<%…%&燃气轮机;在所有这些响应之间执行的调用。写入调用。

    下面是一个例子

    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
    <html>
        <head>
           <title><%= MyMethodCallToFindTitle() %></title>
        </head>
        <body>
           <ul>
           <% for(int i = 0; i < 10; i++){ %>
             <li><%= i %></li>
           <% } %>
           </ul>
        </body>
    </html>
    

    Response.Write(@"<html>
        <head>
           <title>");
    Response.Write(MyMethodCallToFindTitle());
    Response.Write(@"</title>
        </head>
        <body>
           <ul>");
    for(int i = 0; i < 10; i++){
        Response.Write(@"<li>");
        Response.Write(i);
        Response.Write(@"</li>");
    }
    Response.Write(@"</ul>
        </body>
    </html>");
    

    注意:当然,如果你的HTML中有“挂起”的话,会有很多事情发生,还有换行符、制表符缩进等等,但这是一般概述。

    我希望这有帮助。

        2
  •  1
  •   Mark Dickinson    15 年前

    <%= myModelStringProperty %>
    

    <%= Model.MyProperty %>
    

    在需要的地方输出数据。只需将视图本身视为数据的html模板即可。

        3
  •  1
  •   Elijah66    15 年前

    Mark刚刚指出了这一点,但要使用您的代码示例,您的控制器中会有如下内容:

    public ActionResult About() {
        var cookie = Request.Cookies["mvcData"];
        //rest of cookie code here
        Response.Cookies.Add(newCookie);
        ViewData["hello"] = "hi there..."; //add something to viewdata
    
        return View();
    }