【问题标题】:What is the status of runat="server" tags in ASP.NET MVC?ASP.NET MVC 中 runat="server" 标记的状态是什么?
【发布时间】:2009-01-15 12:24:38
【问题描述】:

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

在我阅读的 StackOverflow 对话中

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

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

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

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

【问题讨论】:

    标签: .net asp.net-mvc runatserver


    【解决方案1】:

    如果您在任何元素(例如 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' 超出范围的疯狂。最终,当您查看完整生成的代码时,您会看到 &lt;div&gt; 已作为其完整的方法生成 - 这当然是一个不同的范围,看不到猫。

    回到 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 的代码隐藏在标题标签内查找现有值(&lt;%= Html.Encode(ViewData["Title"]) %&gt; 将在此处输出。如果找到一个(这将是所有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 承诺的关于该主题的博客文章 - 以防 runat 服务器也为我的 CSS 和 JS 提供任何有用的东西。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 嗯,那为什么当我创建一个默认的 MVC 视图母版页时,它有三个 runat 服务器?看起来,如果这些不是典型的 MVC 构造,那么至少代码默认值不会有它们。
      • 它仍在使用 ASP 呈现引擎,而 ContentPlaceHolders 是您在 ASP.NET 中构建母版页的方式。请注意,关键是“如果您发现自己在代码隐藏中使用它”——MVC 中的占位符未在代码隐藏中处理。
      【解决方案3】:

      只需阅读本教程:

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

      你需要的

      <head runat="server">
      

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

      【讨论】:

      • 不,你没有。您可以使用 ViewData 或将 MasterPages 与 contentplaceholder 一起使用。
      • 对,我的意思是“自动”。对,你当然可以接手自己做。
      • 不,head runat="server" (aka HeaderControl) 可以很容易地在 head 部分引用 .css 和 .js 文件。它将重写 Href 值。我想我会就此写一篇博文。
      • 也适用于 html 文档中其他地方的 Href 和 Src 值。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-05-20
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2011-04-29
        相关资源
        最近更新 更多