Каково состояние тегов runat="server" в ASP.NET MVC?
В некоторых текстах ASP.NET MVC говорится, что "нет тегов сервера runat", даже в этой статье MSDN говорится, что когда прямо над этим оператором есть пример кода с тегом сервера runat в элементе HEAD:
И на разговорах Stackru я читаю
"Тот факт, что вы хотите использовать элементы управления"runat=server", означает, что вы должны делать традиционное приложение ASP.NET.
И, конечно, на странице Site.Master есть атрибуты сервера runat в ContentPlaceHolders.
Единственное, что я вижу отсутствующим в ASP.NET MVC с точки зрения сервера runat, - это вездесущий тег FORM runat="server" на каждой странице / представлении ASPX.
Но как насчет остальных тегов сервера runat в ASP.NET MVC, что люди имеют в виду, когда говорят, что в ASP.NET MVC их нет?
4 ответа
Если вы используете тег 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>
Это заставило меня задуматься - если мы используем синтаксис <% =, чтобы записать заголовок прямо в title
тег - тогда зачем нам делать это runat?
Оказывается, как я подозревал, что код для head
ищет существующее значение внутри тега заголовка (который был бы выведен здесь <%= Html.Encode(ViewData["Title"]) %>
, Если он найдет один (который будет иметь место для всех примеров представлений в шаблоне 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
имущество. Но я воздерживаюсь от этого ожидаемого обещанного поста Фила в блоге - на тот случай, если сервер runat даст мне что-нибудь полезное для моих CSS и JS.
Они не означают, что вы не можете использовать runat="server", но скорее нет необходимости использовать серверные элементы управления, как правило, в MVC. Если вы обнаружите, что вам нужен серверный элемент управления и работаете с ним в коде позади, это указывает на то, что приложение стремится к веб-формам. Все вещи, которые обычно происходят в вашем коде позади, теперь должны обрабатываться в вашем контроллере или в самой логике представления.
MVC - это просто слой поверх веб-форм. Мои пользовательские элементы управления веб-формами также требуют, чтобы тег head был доступен на стороне сервера для регистрации скрипта. Эти пользовательские элементы управления обрабатываются на стороне клиента и не используют события состояния сервера или сервера. Из-за этого их также можно использовать в MVC с механизмом просмотра ASPX.
Просто прочитайте в этом уроке:
http://www.asp.net/learn/mvc/tutorial-12-cs.aspx
что вам нужно
<head runat="server">
чтобы можно было легко определить заголовок страницы в ваших представлениях.