18

ASP.NET MVC 上的一些文本声明“没有 runat 服务器标签”,甚至这篇 MSDN 文章也这么说,当在该语句的正上方有一个代码示例,其中 HEAD 元素中有一个 runat 服务器标签:

在我阅读的 StackOverflow 对话中

“您想要使用“runat=server”控件的事实意味着您应该使用传统的 ASP.NET 应用程序。

当然,在 Site.Master 页面中,ContentPlaceHolders 中有 runat 服务器属性。

就 runat 服务器而言,我看到的 ASP.NET MVC 中唯一缺少的是每个 .aspx 页面/视图上无处不在的 FORM runat="server" 标记。

但是 ASP.NET MVC 中的其余 runat 服务器标签呢,人们说 ASP.NET MVC 没有这些是什么意思?

4

4 回答 4

7

如果您在任何元素(例如 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 提供任何有用的东西。

于 2009-01-24T11:06:53.890 回答
2

它们并不意味着您不能使用 runat="server",而是通常在 MVC 中没有必要使用服务器端控件。如果您发现您需要一个服务器端控件并在代码隐藏中使用它,这表明该应用程序正在回归 Web 表单。通常在您的代码隐藏中发生的所有事情现在都应该在您的控制器或视图逻辑本身中处理。

于 2009-01-15T12:29:49.260 回答
1

只需阅读本教程:

http://www.asp.net/learn/mvc/tutorial-12-cs.aspx

你需要

<head runat="server">

能够在您的视图中轻松定义页面标题。

于 2009-01-15T12:48:33.247 回答
1

MVC 只是 Web 表单之上的一层。我的自定义 webforms 控件还要求 head 标签可以在服务器端访问以进行脚本注册。这些自定义控件在客户端呈现,不使用视图状态或服务器端事件。因此,它们也可以在带有 ASPX 视图引擎的 MVC 中使用。

于 2011-12-19T21:12:51.227 回答