ASP.NET MVC中runat =“server”标签的状态是什么?

时间:2009-01-15 12:24:39

标签: .net asp.net-mvc runatserver

ASP.NET MVC上的一些文章指出“没有runat服务器标签”,即使这篇MSDN文章也这样说,在该语句的正上方,在HEAD元素中有一个带有runat服务器标签的代码示例: / p>

在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 个答案:

答案 0 :(得分: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'超出范围的一些疯狂。最后,当你查看完整生成的代码时,你会发现<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>

这让我想知道 - 如果我们使用&lt;%=语法将标题直接写入title标记 - 那么为什么我们需要让它运行?

事实证明,我怀疑head的代码隐藏在标题标记内部查找现有值(这将由<%= Html.Encode(ViewData["Title"]) %>输出。如果找到一个(将是{对于MVC模板中的所有示例视图的情况)然后它将不再做任何事情。如果没有标题存在(如果ViewData [“Title”]为空或空)它将默认为{在您的视图中定义的任何内容{ {1}}属性:

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'属性中填充我的页面标题。但是我暂时没有做好这个有关这个主题的Phil的承诺博客文章 - 如果runat服务器给了我对CSS和JS有用的东西。

答案 1 :(得分:2)

它们并不意味着您不能使用runat =“server”,而是通常在MVC中不必使用服务器端控件。如果您发现需要服务器端控件并在代码隐藏中使用它,那表明应用程序正在趋向于webforms。通常在您的代码隐藏shoulo中发生的所有事情现在都可以在您的控制器或视图逻辑本身中处理。

答案 2 :(得分:1)

请阅读本教程:

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

你需要

<head runat="server">

可以在您的视图中轻松定义页面标题。

答案 3 :(得分:1)

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