What is the status of runat=“server” tags in ASP.NET MVC?

依然范特西╮ 提交于 2019-11-29 03:08:48
Simon_Weaver

If you use a runat="server" tag on ANY element, such as a DIV it will render that code as a separate method in the compiled page.

If you're converting 'legacy' code its a good idea to remove all runat tags right up front otherwise you end up in a situation where code like the following gives you an error.

<% foreach (var cat in cats) { %>
    <div runat="server">
         <span class="name"> <%= cat.name %> </span> is a
         <span class="breed"> <%= cat.breed %> </span>
    </div>
 <% } %>

This code will fail telling you some craziness about 'cat' being out of scope. Eventually when you look at the full generated code you'll see that the <div> has been generated as its whole own method - which is of course a different scope with no cats in sight.

Back for a second to the default template for an MVC application:

You'll see the current template gives you this for the 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>

This left me wondering -- if we're using <%= syntax to write the title directly into the title tag - then why would we need to make it runat?

It turns out as I suspected that the codebehind for head looks for an existing value inside the title tag (which would have been output here by <%= Html.Encode(ViewData["Title"]) %>. If it finds one (which will be the case for the all sample views in the MVC template) then it won't do anything further. If no title exists (if ViewData["Title"] is null or empty) it will default to whatever is defined in your view by the Title attribute :

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/RRMaster.Master" 
Title="View Products" AutoEventWireup="true" CodeBehind="ViewProduct.aspx.cs"
Inherits="RR_MVC.Views.Products.ViewProduct" %>

In my master page I would have removed the runat='server' tag - since I dont think I'll ever want to populate my page title from the view's Title property. But I'm holding off doing this pending Phil's promised blog post on the subject - in case the runat server gives me anything useful for my CSS and JS too.

They don't mean that you can't use runat="server", but rather that it not necessary to use server-side controls, generally, in MVC. If you find that you need a server-side control and are working with it in code-behind that's and indication that the application is tending back toward webforms. All of the stuff that would normally happen in your code-behind shoulo now be handled in your controller or in the view logic itself.

Just read in this tutorial:

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

that you need the

<head runat="server">

to be able to easily define the page title in your views.

MVC is just a layer on top of webforms. My custom webforms controls also require the head tag to be accessible serverside for script registration. These custom controls are rendered clientside and don't use viewstate or serverside events. Because of this they can also be used in MVC with the ASPX view engine.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!