Каково состояние тегов runat = "server" в ASP.NET MVC? - PullRequest
18 голосов
/ 15 января 2009

В некоторых текстах ASP.NET MVC говорится, что «нет тегов сервера runat», даже в этой статье MSDN говорится, что когда прямо над этим оператором есть пример кода с тегом сервера runat в элементе HEAD:

А в разговорах StackOverflow я читаю

"Тот факт, что вы хотите использовать Управление "runat = server" означает, что вы должен делать традиционный ASP.NET приложение.

И, конечно, на странице Site.Master есть атрибуты сервера runat в ContentPlaceHolders.

Единственное, что я вижу отсутствующим в ASP.NET MVC в терминах сервера runat, - это вездесущий тег FORM runat = "server" на каждой странице / представлении ASPX.

А как насчет остальных тегов сервера runat в ASP.NET MVC, что люди имеют в виду, когда говорят, что в ASP.NET MVC их нет?

Ответы [ 4 ]

7 голосов
/ 24 января 2009

Если вы используете тег 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>

Это заставило меня задуматься - если мы используем синтаксис <% = для записи заголовка непосредственно в тег <code>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.

2 голосов
/ 15 января 2009

Они не означают, что вы не можете использовать runat = "server", но скорее нет необходимости использовать серверные элементы управления, как правило, в MVC. Если вы обнаружите, что вам нужен серверный элемент управления и работаете с ним в коде позади, это указывает на то, что приложение стремится к веб-формам. Все, что обычно происходит в вашем коде позади, теперь должно обрабатываться в вашем контроллере или в самой логике представления.

1 голос
/ 20 декабря 2011

MVC - это просто слой поверх веб-форм. Мои пользовательские элементы управления веб-формами также требуют, чтобы тег head был доступен на стороне сервера для регистрации скрипта. Эти пользовательские элементы управления обрабатываются на стороне клиента и не используют события viewstate или serveride. Из-за этого их также можно использовать в MVC с механизмом просмотра ASPX.

1 голос
/ 15 января 2009

Просто прочитайте в этом уроке:

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

что вам нужно

<head runat="server">

чтобы можно было легко определить заголовок страницы в ваших представлениях.

...