ASP.NET MVC HTML писатель ошибка? - PullRequest
0 голосов
/ 07 июля 2011

Это, наверное, ошибка. Шаги для воспроизведения:

(1) Создание проекта ASP.NET MVC 3 (механизм просмотра ASPX)

(2) Перейдите в папку «Модели» и создайте новую простую модель

namespace MvcApp.Models
{
    public class MyModel
    {
        public static string MyString = "foo";        
    }
}

(3) Измените файл web.config, добавьте пространство имен моделей, чтобы вы могли использовать модели в своих представлениях.

      ....
      </controls>
      <namespaces>
        <add namespace="MvcApp.Models" />
      </namespaces>
    </pages>
  </system.web>

(4) Перейдите к /Shared/Site.Master, измените раздел <head>.

<head runat="server"> 
    <title><%: MyModel.MyString %><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <link href="<%: MyModel.MyString %>" rel="<%: MyModel.MyString %>" />
    <script src="<%: MyModel.MyString %>" />
</head>

Примечание runat="server" атрибут головы.

(5) Запустите его и посмотрите исходный код страницы. Я думаю, что вы получите (ненужные пробелы удалены):

<head id="Head1">
   <title>foo Index</title>
   <link href="&lt;%: MyModel.MyString %>" rel="&lt;%: MyModel.MyString %>" />
   <script src="foo" />
</head>

Что-то интересное:

а. Все атрибуты тега link оценены неправильно. это похоже на кодирование? При этом одинаковые выражения в title и script являются правильными.

б. Измените 3-ю строку на эту:

<link href="<%: MyModel.MyString %>" rel="<%: string.Format("{0}", "foo") %>" />

OR

<link href="<%: MyModel.MyString %>" rel="<%: "foo" %>" />

Вы получите все правильно (даже href правильно!).

с. head без runat="server" всегда правильно.

Я думаю, что это ошибка при рендеринге представлений в HTML-тексты. Это действительно кошмар, чтобы проверить исходный код и попытаться найти ошибку. Кто-нибудь может сказать мне причину?

1 Ответ

1 голос
/ 07 июля 2011

Простая причина в том, что элемент управления ASP.NET Server никогда не преобразует теги <%%>.Так как ваша голова содержит runat = "server", то ASP.NET Web Form Engine принимает некоторые внутренние решения для каждого дочернего элемента управления, делать его элементом управления веб-сервером или нет.

Поместите это

<head id="Head1" runat="server"> 
<title><%: MyModel.MyString %><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
<link id="link1" href="<%: MyModel.MyString %>" rel="<%: MyModel.MyString %>" />
<link id="link2" href="<%: MyModel.MyString %>" rel="<%: string.Format("{0}", "foo") %>" /><%sa %>
<script src="<%: MyModel.MyString %>" />
</head>

<script src="<%: MyModel.MyString %>" />

Теперь внимательно проверьте Показать полный источник компиляции:

...