[asp.net-mvc]挂在 aspx 文件的 ASP.NET MVC 应用程序中的代码是如何执行的?

发布时间: 2017/3/25 4:49:37
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这个问题可能听起来很奇怪,但我发现它真的很难消化一个 ASP.NET MVC 应用程序中的典型 aspx 页。例如︰

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

编写的代码 < %...%> 作品以及预期但怎么能我想象这中的代码吗?当然它从意味着,所以是一个类继承写任何代码 < %..%>并得到执行的一些方法。对不对?

编辑︰ 编写代码 < %..%>是不相关的。我写它,以测试 cookie。关键在于此代码在类的映射?

解决方法 1:

当您创建 ASP.Net MVC View(Page) 它继承自类,正如你所说叫意味着-回报从 ASP.Net WebForms (System.Web.UI.Page) 从 Page 类继承、 实现 IViewDataContainer 接口 (从 MVC)。

Page 类实现 IHttpHandler 接口的 IIS"谈话"。

所有在所有 IHttpHandler 已调用方法以 HttpContext 实例的 ProcessRequest。

在这里发生了一大堆的魔法 (好吧,它是是魔术,但你的想法)-类是新会向上 (你意味着) 和它有获取调用的几种方法-主版页面等等一些挂钩和其中之一将以某种方式读取.aspx 页被包裹在冰岛呼吁所有正常输出而其余部分将作为 C# 代码运行 (和 < %=...%> 将会变成冰岛电话太)-并相信这种解析做通过正则表达式。

请注意,我不是专家就此和最有可能从技术上讲错了 (嘿,有人随意张贴更好的回应,我试着给我们一般的理解) 但它应给整体和一般理解这一点。

编辑︰ 我还可以补充,当你返回 ViewResult 通过您的控制器类它最终会调用方法 (我相信这就叫做执行),来自一个类,它继承自,,然后将启动一个程序的采摘权涉及这一论题,默认被 WebForms 之一,整个过程,然后调用表示高于一切这大巨大编辑混乱。

@Hermant 的评论我说过,如果你拿出大师你需要想方法的整个.aspx 页的页东西哪里不包中的所有东西 < %和 %> 要看起来像的 C# 代码︰

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

每隔一会儿你有你 < %...%> 调用的执行在所有这些条记录调用之间。

其中说采取以下.aspx

<%@ 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,和换行符,制表符缩进等等,但这一般性的概述。

我希望这可以帮助。

赞助商