如果您在任何元素(例如 DIV)上使用 runat="server" 标记,它将将该代码呈现为已编译页面中的单独方法。
如果您要转换“遗留”代码,最好先删除所有 runat 标签,否则您最终会遇到如下代码给您错误的情况。
<% foreach (var cat in cats) { %>
<div runat="server">
<span class="name"> <%= cat.name %> </span> is a
<span class="breed"> <%= cat.breed %> </span>
</div>
<% } %>
此代码将无法告诉您一些关于'cat'
超出范围的疯狂。最终,当您查看完整生成的代码时,您会看到它<div>
已作为其完整的方法生成 - 这当然是一个不同的范围,看不到猫。
回到 MVC 应用程序的默认模板:
您将看到当前模板为您提供了以下内容head
:
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><%= Html.Encode(ViewData["Title"]) %></title>
<link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
</head>
这让我想知道——如果我们使用 <%= 语法将标题直接写入title
标签——那么我们为什么需要让它运行呢?
事实证明,我怀疑代码隐藏head
在标题标签内查找现有值(这将在此处由 . 输出<%= Html.Encode(ViewData["Title"]) %>
。如果找到一个(MVC 模板中的所有示例视图都是这种情况),那么它不会做任何进一步的事情。如果不存在标题(如果 ViewData["Title"] 为 null 或为空),它将默认为您视图中由Title
属性定义的任何内容:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/RRMaster.Master"
Title="View Products" AutoEventWireup="true" CodeBehind="ViewProduct.aspx.cs"
Inherits="RR_MVC.Views.Products.ViewProduct" %>
在我的母版页中,我会删除该runat='server'
标签 - 因为我认为我永远不想从视图的Title
属性中填充我的页面标题。但是我暂缓执行 Phil 承诺的关于该主题的博客文章 - 以防 runat 服务器也为我的 CSS 和 JS 提供任何有用的东西。