URL-адреса на эталонных страницах (C#)URLs in Master Pages (C#)

по Скотт Митчеллby Scott Mitchell

Скачать код или скачать PDFDownload Code or Download PDF

Решает, как могут быть нарушены URL-адреса на главной странице из-за того, что файл главной страницы находится в другом относительном каталоге, чем на странице содержимого.Addresses how URLs in the master page can break due to the master page file being in a different relative directory than the content page. Выполняет поиск перенаправленных URL-адресов через ~ в декларативном синтаксисе и программно с помощью Ресолвеурл и Ресолвеклиентурл.Looks at rebasing URLs via ~ in the declarative syntax and using ResolveUrl and ResolveClientUrl programmatically. (Также взгляните на(Also look at

ВведениеIntroduction

Во всех примерах, которые мы видели до сих пор, страницы главного и содержимого находятся в той же папке (корневая папка веб-сайта).In all the examples we've seen thus far, the master and content pages have been located in the same folder (the website's root folder). Но нет причин, по которым Главная страница и страницы содержимого должны находиться в одной папке.But there's no reason why the master and content pages must be in the same folder. Конечно, можно создавать страницы содержимого во вложенных папках.You can certainly create content pages in subfolders. Аналогичным образом вы можете создать папку ~/MasterPages/, в которую будут размещены главные страницы сайта.Similarly, you might create a ~/MasterPages/ folder where you place your site's master pages.

Одна из потенциальных проблем, связанная с размещением главных и страниц содержимого в разных папках, заключается в нарушении URL-адресовOne potential issue with placing master and content pages in different folders involves broken URLs. Если Главная страница содержит относительные URL-адреса в гиперссылках, изображениях или других элементах, ссылка будет недействительной для страниц содержимого, расположенных в другой папке.If the master page contains relative URLs in hyperlinks, images, or other elements, the link will be invalid for content pages that reside in a different folder. В этом учебнике рассматривается источник этой проблемы, а также способы их обхода.In this tutorial we examine the source of this problem as well as workarounds.

Проблема с относительными URL-адресамиThe Problem with Relative URLs

Ссылка на веб-страницу считается относительным URL-адресом , если расположение ресурса, на который он указывает, определяется относительно расположения веб-страницы в структуре папок веб-сайта.A URL on a web page is said to be a relative URL if the location of the resource it points to is relative to the web page's location in the website's folder structure. Любой URL-адрес, не начинающийся с начальной косой черты (/) или протокола (например, http://), является относительным, так как он разрешается браузером на основе расположения веб-страницы, содержащей URL-адрес.Any URL that does not start with a leading forward slash (/) or a protocol (such as http://) is relative because it is resolved by the browser based on the location of the web page that contains the URL.

Например, наш веб-сайт имеет папку ~/Images/ с одним файлом изображения PoweredByASPNET.gif.For example, our website has an ~/Images/ folder with a single image file, PoweredByASPNET.gif. Файл главной страницы Site.master содержит элемент <img> в области footerContent со следующей разметкой:The master page file Site.master has an <img> element in the footerContent region with the following markup:

<div id="footerContent">
 <img src="Images/PoweredByASPNET.gif" alt="Powered by ASP.NET!" />
</div>

Значение атрибута src в элементе <img> является относительным URL-адресом, так как не начинается с / или http://.The src attribute value in the <img> element is a relative URL because it does not start with / or http://. Вкратце, значение атрибута src указывает обозревателю искать в подпапке Images файла с именем PoweredByASPNET.gif.In short, the src attribute value tells the browser to look in the Images subfolder for a file named PoweredByASPNET.gif.

При посещении страницы содержимого приведенная выше разметка отправляется непосредственно в браузер.When visiting a content page, the above markup is sent directly to the browser. Уделите время посетить About.aspx и просмотреть исходный HTML-код, отправленный в браузер.Take a moment to visit About.aspx and view the HTML source sent to the browser. Вы обнаружите, что та же разметка на главной странице была отправлена в браузер.You will find that the exact same markup in the master page was sent to the browser.

<div id="footerContent">
 <img src="Images/PoweredByASPNET.gif" alt="Powered by ASP.NET!" />
</div>

Если страница содержимого находится в корневой папке (как и About.aspx), все работает должным образом, так как существует Images вложенная папка относительно корневой папки.If the content page is in the root folder (as is About.aspx) everything works as expected because there is an Images subfolder relative to the root folder. Тем не менее, если страница содержимого находится в папке, отличной от папки главной страницы, она разбивается на страницы.However, things break down if the content page is in a different folder than the master page. Чтобы проиллюстрировать это, создайте вложенную папку с именем Admin.To illustrate this, create a subfolder named Admin. Затем добавьте страницу содержимого с именем Default.aspx в папку Admin и убедитесь, что новая страница привязывается к главной странице Site.master.Next, add a content page named Default.aspx to the Admin folder, making sure to bind the new page to the Site.master master page.

Note

В разделе Указание заголовка, Meta-тегов и других заголовков HTML в учебнике по главной странице мы создали пользовательский класс базовой страницы с именем BasePage, который автоматически задает заголовок страницы содержимого (если он не был явно назначен).In the Specifying the Title, Meta Tags, and Other HTML Headers in the Master Page tutorial we created a custom base page class named BasePage that automatically set the content page's title (if it was not explicitly assigned). Не забудьте создать класс кода программной части созданной страницы от BasePage, чтобы он мог использовать эту функцию.Don't forget to have the newly created page's code-behind class derive from BasePage so that it can utilize this functionality.

После создания этой страницы содержимого обозреватель решений должны выглядеть примерно так, как показано на рис. 1.After you have created this content page, your Solution Explorer should look similar to Figure 1.

В проект добавлены Новая папка и страница ASP.NET

Рис. 01. в проект добавлены Новая папка и страница ASP.NETFigure 01: A New Folder and ASP.NET Page Have Been Added to the Project

Затем обновите файл Web.sitemap, включив в него новую запись <siteMapNode> для этого занятия.Next, update the Web.sitemap file to include a new <siteMapNode> entry for this lesson. В следующем коде XML показана полная разметка Web.sitemap, которая теперь включает в себя добавление третьего элемента <siteMapNode>.The following XML shows the complete Web.sitemap markup, which now includes the addition of a third <siteMapNode> element.

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
 <siteMapNode url="~/Default.aspx" title="Home">
 <siteMapNode url="~/About.aspx" title="About the Author" />
 <siteMapNode url="~/MultipleContentPlaceHolders.aspx" title="Using Multiple ContentPlaceHolder Controls" />
 <siteMapNode url="~/Admin/Default.aspx" title="Rebasing URLs" />
 </siteMapNode>
</siteMap>

Только что созданная страница Default.aspx должна иметь четыре элемента управления содержимым, соответствующие четырем элементов управления ContentPlaceHolder в Site.master.The newly created Default.aspx page should have four Content controls corresponding to the four ContentPlaceHolders in Site.master. Добавьте некоторый текст в элемент управления содержимым, ссылающийся на MainContent ContentPlaceHolder, а затем откройте страницу в браузере.Add some text to the Content control referencing the MainContent ContentPlaceHolder and then visit the page through a browser. Как показано на рис. 2, браузер не может найти файл изображения PoweredByASPNET.gif.As Figure 2 shows, the browser cannot find the PoweredByASPNET.gif image file. В чем причина?What's going on here?

Страница содержимого ~/Admin/Default.aspx отправляет тот же код HTML для footerContent региона, который был About.aspx страницей:The ~/Admin/Default.aspx content page is sent the same HTML for the footerContent region as was the About.aspx page:

<div id="footerContent">
 <img src="Images/PoweredByASPNET.gif" alt="Powered by ASP.NET!" />
</div>

Так как атрибут src элемента <img> является относительным URL-адресом, браузер пытается найти папку Images относительно расположения папки на странице.Because the <img> element's src attribute is a relative URL, the browser attempts to look for an Images folder relative to the web page's folder location. Иными словами, браузер ищет файл изображения Admin/Images/PoweredByASPNET.gif.In other words, the browser is looking for the image file Admin/Images/PoweredByASPNET.gif.

не удается найти файл изображения Повередбяспнет. gifThe PoweredByASPNET.gif Image File Cannot Be Found

Рис. 02. не удается найти файл изображения PoweredByASPNET.gif (щелкните, чтобы просмотреть изображение с полным размером)Figure 02: The PoweredByASPNET.gif Image File Cannot Be Found (Click to view full-size image)

Замена относительных URL-адресов абсолютными URL-адресамиReplacing Relative URLs with Absolute URLs

Противоположностью относительного URL-адреса является абсолютный URL-адрес, который начинается с косой черты (/) или протокола, например http://.The opposite of a relative URL is an absolute URL, which is one that starts with a forward slash (/) or a protocol such as http://. Поскольку абсолютный URL-адрес указывает расположение ресурса из известной фиксированной точки, тот же абсолютный URL-адрес действителен на любой веб-странице, независимо от расположения веб-страницы в структуре папок веб-сайта.Because an absolute URL specifies the location of a resource from a known fixed point, the same absolute URL is valid in any web page, regardless of the web page's location in the website's folder structure.

Чтобы исправить неработающий образ, показанный на рис. 2, необходимо обновить атрибут src элемента <img>, чтобы он использовал абсолютный URL-адрес вместо относительного.To remedy the broken image shown in Figure 2, we need to update the <img> element's src attribute so that it uses an absolute URL instead of a relative one. Чтобы определить правильный абсолютный URL-адрес, посетите одну из веб-страниц на веб-сайте и изучите адресную строку.To determine the correct absolute URL, visit one of the web pages in your website and examine the Address bar. Как показано в адресной строке на рис. 2, полный путь к веб-приложению http://localhost:3908/ASPNET_MasterPages_Tutorial_04_CS/.As the Address bar in Figure 2 shows, the fully qualified path to the web application is http://localhost:3908/ASPNET_MasterPages_Tutorial_04_CS/. Поэтому можно обновить атрибут src элемента <img> до одного из следующих двух абсолютных URL-адресов:Therefore, we could update the <img> element's src attribute to either of the following two absolute URLs:

  • /ASPNET_MasterPages_Tutorial_04_CS/Images/PoweredByASPNET.gif
  • http://localhost:3908/ASPNET_MasterPages_Tutorial_04_CS/Images/PoweredByASPNET.gif

Уделите время, чтобы обновить атрибут src элемента <img> до абсолютного URL-адреса, используя одну из приведенных выше форм, а затем посетить страницу ~/Admin/Default.aspx в браузере.Take a moment to update the <img> element's src attribute to an absolute URL using one of the forms shown above and then visit the ~/Admin/Default.aspx page through a browser. На этот раз браузер будет правильно находить и отображать файл изображения PoweredByASPNET.gif (см. рис. 3).This time the browser will correctly find and display the PoweredByASPNET.gif image file (see Figure 3).

изображение Повередбяспнет. gif теперь отображаетсяThe PoweredByASPNET.gif Image is Now Displayed

Рис. 03. теперь отображается изображение PoweredByASPNET.gif (щелкните, чтобы просмотреть изображение с полным размером)Figure 03: The PoweredByASPNET.gif Image is Now Displayed (Click to view full-size image)

Хотя жестко программировать в абсолютном URL-адресе, он тесно прикрепляет ваш код HTML к серверу и расположению папки веб-сайта, что может измениться.While hard coding in the absolute URL works, it tightly couples your HTML to the website's server and folder location, which may change. Использование абсолютного URL-адреса формы http://localhost:3908/... нестабильным, так как номер порта, предшествующий localhost, выбирается автоматически при запуске встроенного веб-сервера ASP.NET Development Visual Studio.Using an absolute URL of the form http://localhost:3908/... is brittle because the port number preceding localhost is selected automatically each time Visual Studio's built-in ASP.NET Development Web Server is started. Аналогичным образом http://localhost часть допустима только при локальном тестировании.Similarly, the http://localhost part is only valid when testing locally. После развертывания кода на рабочем сервере база URL-адреса изменится на что-то другое, например http://www.yourserver.com.Once the code is deployed to a production server, the URL base will change to something else, like http://www.yourserver.com. Абсолютный URL-адрес в форме /ASPNET_MasterPages_Tutorial_04_CS/... также пострадает от того же хрупкости, так как часто этот путь к приложению отличается от сервера разработки и рабочих серверов.The absolute URL in the form /ASPNET_MasterPages_Tutorial_04_CS/... also suffers from the same brittleness because oftentimes this application path differs between development and production servers.

Хорошая новость заключается в том, что ASP.NET предлагает метод для создания допустимого относительного URL-адреса во время выполнения.The good news is that ASP.NET offers a method for generating a valid relative URL at runtime.

Использование~иResolveClientUrlUsing~andResolveClientUrl

Вместо того, чтобы жестко кодировать абсолютный URL-адрес, ASP.NET позволяет разработчикам страниц использовать тильду (~) для указания корневого каталога веб-приложения.Rather than hard code an absolute URL, ASP.NET allows page developers to use the tilde (~) to indicate the root of the web application. Например, ранее в этом учебнике я использовал нотацию ~/Admin/Default.aspx в тексте для ссылки на страницу Default.aspx в папке Admin.For example, earlier in this tutorial I used the notation ~/Admin/Default.aspx in the text to refer to the Default.aspx page in the Admin folder. ~ указывает, что папка Admin является вложенной папкой корневого каталога веб-приложения.The ~ indicates that the Admin folder is a subfolder of the web application's root.

МетодResolveClientUrl Control класса принимает URL-адрес и изменяет его на относительный URL-адрес, соответствующий веб странице, на которой находится элемент управления.The Control class's ResolveClientUrl method takes a URL and modifies it to a relative URL appropriate for the web page on which the control resides. Например, вызов ResolveClientUrl("~/Images/PoweredByASPNET.gif") из About.aspx возвращает Images/PoweredByASPNET.gif.For example, calling ResolveClientUrl("~/Images/PoweredByASPNET.gif") from About.aspx returns Images/PoweredByASPNET.gif. Однако вызов его из ~/Admin/Default.aspxвозвращает ../Images/PoweredByASPNET.gif.Calling it from ~/Admin/Default.aspx, however, returns ../Images/PoweredByASPNET.gif.

Note

Поскольку все серверные элементы управления ASP.NET являются производными от класса Control, все серверные элементы управления имеют доступ к методу ResolveClientUrl.Because all ASP.NET server controls derive from the Control class, all server controls have access to the ResolveClientUrl method. Даже класс Page является производным от класса Control, что позволяет использовать этот метод непосредственно из классов кода программной части страниц ASP.NET.Even the Page class derives from the Control class, meaning that you can use this method directly from your ASP.NET pages' code-behind classes.

Использование~в декларативной разметкеUsing~in the Declarative Markup

Некоторые веб-элементы управления ASP.NET включают свойства, связанные с URL-адресами: элемент управления HyperLink имеет свойство NavigateUrl; элемент управления "изображение" имеет свойство ImageUrl; и т. д.Several ASP.NET Web controls include URL-related properties: the HyperLink control has a NavigateUrl property; the Image control has an ImageUrl property; and so on. При подготовке к просмотру эти элементы управления передают значения свойств, связанные с URL-адресом, в ResolveClientUrl.When rendered, these controls pass their URL-related property values to ResolveClientUrl. Следовательно, если эти свойства содержат ~ для указания корневого каталога веб-приложения, URL-адрес будет изменен на допустимый относительный URL-адрес.Consequently, if these properties contain a ~ to indicate the root of the web application, the URL will be modified to a valid relative URL.

Помните, что ~ в свойствах, связанных с URL-адресами, преобразовывают только элементы управления сервера ASP.NET.Keep in mind that only ASP.NET server controls transform the ~ in their URL-related properties. Если ~ появляется в статической HTML-разметке, например <img src="~/Images/PoweredByASPNET.gif" />, обработчик ASP.NET отправляет ~ в браузер вместе с остальной частью содержимого HTML.If a ~ appears in static HTML markup, such as <img src="~/Images/PoweredByASPNET.gif" />, the ASP.NET engine sends the ~ to the browser along with the rest of the HTML content. В браузере предполагается, что ~ является частью URL-адреса.The browser assumes that the ~ is part of the URL. Например, если браузер получает разметку <img src="~/Images/PoweredByASPNET.gif" /> предполагается, что есть вложенная папка с именем ~ с вложенной папкой Images, которая содержит файл изображения PoweredByASPNET.gif.For example, if the browser receives the markup <img src="~/Images/PoweredByASPNET.gif" /> it assumes there is a subfolder named ~ with a subfolder Images that contains the image file PoweredByASPNET.gif.

Чтобы исправить разметку изображения в Site.master, замените существующий элемент <img> веб-элементом управления Image ASP.NET.To fix the image markup in Site.master, replace the existing <img> element with an ASP.NET Image Web control. Задайте для ID веб-элемента управления Image значение PoweredByImage, его свойство ImageUrl ~/Images/PoweredByASPNET.gif, а для свойства AlternateText — значение "на платформе ASP.NET!".Set the Image Web control's ID to PoweredByImage, its ImageUrl property to ~/Images/PoweredByASPNET.gif, and its AlternateText property to "Powered by ASP.NET!"

<div id="footerContent">
 <asp:Image ID="PoweredByImage" runat="server" ImageUrl="~/Images/PoweredByASPNET.gif" 
    AlternateText="Powered by ASP.NET!" />
</div>

После внесения этого изменения на главную страницу снова перейдите на страницу ~/Admin/Default.aspx.After making this change to the master page, revisit the ~/Admin/Default.aspx page again. На этот раз файл изображения PoweredByASPNET.gif отображается на странице (см. рис. 3).This time the PoweredByASPNET.gif image file appears in the page (see Figure 3). При подготовке к просмотру веб-элемента управления изображение использует метод ResolveClientUrl для разрешения ImageUrl значения свойства.When the Image Web control is rendered it uses the ResolveClientUrl method to resolve its ImageUrl property value. В ~/Admin/Default.aspx ImageUrl преобразуется в соответствующий относительный URL-адрес, как показано в следующем фрагменте кода HTML:In ~/Admin/Default.aspx the ImageUrl is converted into an appropriate relative URL, as the following snippet of HTML source shows:

<div id="footerContent">
 <img id="ctl00_PoweredByImage" src="../Images/PoweredByASPNET.gif" alt="Powered by ASP.NET!" />
</div>

Note

Помимо использования в свойствах веб-элемента управления на основе URL-адреса, ~ можно также использовать при вызове методов Response.Redirect и Server.MapPath, помимо прочего.In addition to being used in URL-based Web control properties, the ~ can also be used when calling the Response.Redirect and Server.MapPath methods, among others. Кроме того, при необходимости метод ResolveClientUrl можно вызвать непосредственно из декларативной разметки ASP.NET или главной страницы. см. запись блога Фриц кальки с помощью ResolveClientUrl в разметке.Also, the ResolveClientUrl method may be invoked directly from an ASP.NET or master page's declarative markup, if needed; see Fritz Onion's blog entry Using ResolveClientUrl in Markup.

Исправление оставшихся относительных URL-адресов главной страницыFixing the Master Page's Remaining Relative URLs

В дополнение к элементу <img> в footerContent, который мы только что устранили, Главная страница содержит еще один относительный URL-адрес, требующий нашего внимания.In addition to the <img> element in the footerContent that we just fixed, the master page contains one more relative URL that requires our attention. В topContent области содержатся ссылки «учебники по главным страницам», указывающие на Default.aspx.The topContent region includes the link "Master Pages Tutorials," which points to Default.aspx.

<div id="topContent">
 <a href="Default.aspx">Master Pages Tutorials</a>
</div>

Так как этот URL-адрес является относительным, пользователь будет отправлен на страницу Default.aspx в папке страницы содержимого, которую он посещает.Because this URL is relative, it will send the user to the Default.aspx page in the folder of the content page they are visiting. Чтобы эта ссылка всегда указывала на Default.aspx в корневой папке, необходимо заменить элемент <a> на веб-элемент управления HyperLink, чтобы можно было использовать нотацию ~.To have this link always point to Default.aspx in the root folder we need to replace the <a> element with a HyperLink Web control so that we can use the ~ notation.

Удалите разметку элемента <a> и добавьте на ее место элемент управления HyperLink.Remove the <a> element markup and add a HyperLink control in its place. Задайте для ID гиперссылки значение lnkHome, свойство NavigateUrl ~/Default.aspx, а для свойства Text — "учебники по главным страницам".Set the HyperLink's ID to lnkHome, its NavigateUrl property to ~/Default.aspx, and its Text property to "Master Pages Tutorials."

<div id="topContent">
 <asp:HyperLink ID="lnkHome" runat="server" NavigateUrl="~/Default.aspx"
    Text="Master Pages Tutorials" />
</div>

Вот и все!That's it! На этом этапе все URL-адреса на главной странице должным образом основаны на странице содержимого, независимо от того, в каких папках находится Главная страница и страница содержимого.At this point all the URLs in our master page are properly based when rendered by a content page regardless of what folders the master page and content page are located in.

Автоматическое разрешение URL-адресов в разделе<head>Automatic URL Resolution in the<head>Section

В учебнике Создание макета на уровне сайта с помощью главных страниц мы добавили <link> в файл Styles.css в <head>ном регионе:In the Creating a Site-Wide Layout Using Master Pages tutorial we added a <link> to the Styles.css file in the <head> region:

<head runat="server">
 <title>Untitled Page</title>
 <asp:ContentPlaceHolder id="head" runat="server">
 </asp:ContentPlaceHolder>
 <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>

Хотя атрибут href элемента <link> является относительным, он автоматически преобразуется в соответствующий путь во время выполнения.While the <link> element's href attribute is relative, it's automatically converted to an appropriate path at runtime. Как обсуждалось в разделе Указание заголовка, Meta-тегов и других заголовков HTML в руководстве по главной странице , <head> регион фактически является элементом управления на стороне сервера, что позволяет ему изменять содержимое его внутренних элементов управления при его подготовке к просмотру.As we discussed in the Specifying the Title, Meta Tags, and Other HTML Headers in the Master Page tutorial, the <head> region is actually a server-side control, which enables it to modify the contents of its inner controls when it is rendered.

Чтобы проверить это, вернитесь на страницу ~/Admin/Default.aspx и просмотрите исходный HTML-код, отправленный в браузер.To verify this, revisit the ~/Admin/Default.aspx page and view the HTML source sent to the browser. Как показано в следующем фрагменте кода, href атрибут элемента <link> был автоматически изменен на соответствующий относительный URL-адрес ../Styles.css.As the snippet below illustrates, the <link> element's href attribute has been automatically modified to an appropriate relative URL, ../Styles.css.

<head>
 <title>
 Default
 </title>
 <link href="../Styles.css" rel="stylesheet" type="text/css" />
</head>

СводкаSummary

Главные страницы очень часто содержат ссылки, изображения и другие внешние ресурсы, которые необходимо указать с помощью URL-адреса.Master pages very often include links, images, and other external resources that must be specified via a URL. Так как эталонная страница и страницы содержимого могут отсутствовать в одной папке, важно абстаин с помощью относительных URL-адресов.Because the master page and content pages might not exist in the same folder, it is important to abstain from using relative URLs. Хотя можно использовать жестко закодированные абсолютные URL-адреса, это жестко прикрепляет абсолютный адрес URL к приложению.While it is possible to use hard coded absolute URLs, doing so tightly couples the absolute URL to the web application. При изменении абсолютного URL-адреса, как это часто происходит при перемещении или развертывании веб-приложения, необходимо помнить о необходимости вернуться и обновить абсолютные URL-адреса.If the absolute URL changes - as it often does when moving or deploying a web application - you'll have to remember to go back and update the absolute URLs.

Идеальным подходом является использование тильды (~) для указания корневого каталога приложения.The ideal approach is to use the tilde (~) to indicate the application root. ASP.NET веб-элементы управления, которые содержат свойства, связанные с URL-адресом, сопоставляют ~ с корнем приложения во время выполнения.ASP.NET Web controls that contain URL-related properties map the ~ to the application root at runtime. На внутреннем уровне веб-элементы управления используют метод ResolveClientUrl класса Control для создания допустимого относительного URL-адреса.Internally, the Web controls use the Control class's ResolveClientUrl method to generate a valid relative URL. Этот метод является открытым и доступен из каждого серверного элемента управления (включая класс Page), поэтому его можно использовать программным способом из классов кода программной части, если это необходимо.This method is public and available from every server control (including the Page class), so you can use it programmatically from your code-behind classes, if needed.

Поздравляем с программированием!Happy Programming!

Дополнительные материалыFurther Reading

Дополнительные сведения о разделах, обсуждаемых в этом руководстве, см. в следующих ресурсах:For more information on the topics discussed in this tutorial, refer to the following resources:

Об автореAbout the Author

Скотт Митчелл, автор нескольких книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями майкрософт с 1998.Scott Mitchell, author of multiple ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Скотт работает как независимый консультант, преподаватель и модуль записи.Scott works as an independent consultant, trainer, and writer. Его последняя книга — Sams обучать себя ASP.NET 3,5 за 24 часа.His latest book is Sams Teach Yourself ASP.NET 3.5 in 24 Hours. Скотт можно получить по адресу mitchell@4GuysFromRolla.com или через свой блог по адресу http://ScottOnWriting.NET.Scott can be reached at mitchell@4GuysFromRolla.com or via his blog at http://ScottOnWriting.NET.

Специальная благодарностьSpecial Thanks To

Хотите ознакомиться с моими будущими статьями MSDN?Interested in reviewing my upcoming MSDN articles? Если это так, расположите строку в mitchell@4GuysFromRolla.com.If so, drop me a line at mitchell@4GuysFromRolla.com.