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没有这些标签时,人们的意思是什么?
答案 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视图引擎一起使用。