在ASP.NET MVC中,runat ="server"标签的状态是什么?

19
一些ASP.NET MVC的文本指出“没有runat server标签”,即使这篇MSDN文章也是如此。但在该声明上方有一个带有runat server标签的代码示例在HEAD元素中: 在StackOverflow的讨论中,我读到:

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

当然,在Site.Master页面中,ContentPlaceHolders中有runat server属性。
在ASP.NET MVC中唯一缺少的runat server标记似乎只有每个.aspx页面/视图上随处可见的FORM runat = "server"标记。
但是,关于ASP.NET MVC中其余的runat server标记,人们所说的是什么?
4个回答

7
如果您在任何元素上使用runat="server"标记,比如DIV,它将在编译后的页面中呈现为单独的方法。如果您正在转换“遗留”代码,最好一开始就删除所有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'超出范围的疯狂信息。最终当你查看完整生成的代码时,你会发现
已经作为自己的方法生成了 - 这显然是一个不同的范围,看不到任何猫的存在。
回到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标签中,那么为什么需要使其runat呢?
事实证明,正如我所怀疑的那样,head的代码后台会查找标题标签中的现有值(这里通过<%= Html.Encode(ViewData["Title"]) %>输出)。如果找到一个值(这将是MVC模板中所有示例视图的情况),则它将不会执行任何进一步的操作。如果没有标题存在(如果ViewData["Title"]为空或为空字符串),则它将默认为您的视图中由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在博客上发布有关此主题的承诺文章-以防运行服务器对我的CSS和JS也有所帮助。

2

他们并不是指你不能使用runat="server",而是在MVC中通常不需要使用服务器端控件。如果你发现你需要一个服务器端控件,并且在代码后台中使用它,那么这表明应用程序正在倾向于WebForms。通常在代码后台中发生的所有事情现在应该在你的控制器或视图逻辑本身中处理。


嗯,那么为什么当我创建一个默认的MVC视图主页面时,它会有三个runat服务器?如果这些不是典型的MVC结构,那么代码默认值至少不应该有它们。 - Edward Tanguay
1
它仍在使用ASP渲染引擎,ContentPlaceHolders是您在ASP.NET中构建主页面的方式。请注意,“如果您发现自己在代码后台中使用它”是关键--MVC中的占位符不在代码后台中处理。 - tvanfosson

1

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


1

不,你不需要这样做。你可以使用ViewData或者使用MasterPages和contentplaceholder。 - Chad Moran
没错,我是指“自动地”。当然,你也可以接手并自己来做。 - Edward Tanguay
2
不,head runat="server"(也称为HeaderControl)使得在头部引用.css和.js文件变得容易。它会重写Href值。我想我会写一篇博客文章介绍这个。 - Haacked
同样适用于HTML文档中其他地方的Href和Src值。 - Peter Stephens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接