MSDN上的一些文本指出“没有runat服务器标签”,甚至这篇ASP.NET文章也是这样说的,因为在该语句的正上方有一个在HEAD元素中带有runat服务器标签的代码示例:
在我读到的StackOverflow对话中
“你想使用"runat=server”控件的事实意味着你应该做一个传统的ASP.NET应用程序。
当然,在Site.Master页面中,ContentPlaceHolders中有runat服务器属性。
在运行服务器方面,我在ASP.NET MVC中看到的唯一缺失的是每个.aspx页面/视图上普遍存在的表单服务器“runat=”标记。
但是ASP.NET MVC中其余的runat服务器标签呢?当人们说ASP.NET MVC没有这些标签是什么意思呢?
发布于 2009-01-24 11:06:54
如果在任何元素上使用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-15 12:29:49
这并不意味着你不能使用runat=的“服务器”,而是不需要在MVC中使用服务器端控件。如果您发现需要一个服务器端控件,并且正在代码隐藏中使用它,这表明应用程序正在回归webforms。通常在代码隐藏中发生的所有事情现在都应该在控制器或视图逻辑本身中进行处理。
发布于 2009-01-15 12:48:33
https://stackoverflow.com/questions/446533
复制相似问题