<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2771203200371710927</id><updated>2024-09-08T13:18:36.232+03:00</updated><category term="asp.net"/><category term=".net"/><category term="ajax"/><category term="asp.net mvc"/><category term="c# 4.0"/><category term="javascript"/><category term="jquery"/><category term="32bit"/><category term="4gb"/><category term="best practices"/><category term="blog"/><category term="dbml"/><category term="dropdown"/><category term="dynamic"/><category term="event validation"/><category term="fall update"/><category term="generic"/><category term="generic covariance"/><category term="htmltextwriter"/><category term="json"/><category term="linq2sql"/><category term="mac"/><category term="membership"/><category term="mvc"/><category term="nested repeater"/><category term="nxe"/><category term="os x"/><category term="password"/><category term="pdc"/><category term="ram"/><category term="rendering"/><category term="repeater"/><category term="sql server 2005"/><category term="switcher"/><category term="ui"/><category term="unit testing"/><category term="urlrewriting"/><category term="vista"/><category term="windows 7"/><category term="xbox 360"/><title type='text'>Net Art Development - Разработка со вкусом</title><subtitle type='html'>ASP.NET 2, AJAX, SEO and more</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-912877221889182668</id><published>2010-01-28T20:12:00.003+03:00</published><updated>2010-01-28T20:54:51.369+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="asp.net mvc"/><category scheme="http://www.blogger.com/atom/ns#" term="dropdown"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jquery"/><title type='text'>ASP.NET MVC и jQuery – Dynamic DropDowns</title><content type='html'>&lt;span xmlns=&#39;&#39;&gt;&lt;p&gt;Встречаются ситуации, когда при разработке приложения вам нужно иметь выпадающий список, значения которого зависят от выбранного значения в другом выпадающем списке. Классический пример – форма обратной связи, подгружающей значения штатов и областей на основании выбранной страны. Например, если я выберу «United States», то во втором списке я хочу получить соответсвтующие штаты: New York, Alabama, Texas и т.д. Если же я выберу «Canada» - области Nova Scotia и Ontario. К счасть с использованием ASP.NET MVC и jQuery достичь такой функциональности довольно просто. А главное мы сможем это сделать без постбэков, используя jQuery AJAX.
&lt;/p&gt;&lt;p&gt;Для начала убедитесь, что вы ссылаетесь на библиотеку jQuery, желательно в теге HEAD. Для этого примера взята верся jQuery 1.4. Вы можете скачать ее локально, либо использовать сервис Google:
&lt;/p&gt;&lt;p&gt;&lt;span style=&#39;color:blue&#39;&gt;&lt;span style=&#39;font-family:Consolas; font-size:9pt&#39;&gt;&amp;lt;&lt;span style=&#39;color:maroon&#39;&gt;script&lt;span style=&#39;color:black&#39;&gt; &lt;span style=&#39;color:red&#39;&gt;src&lt;span style=&#39;color:blue&#39;&gt;=&quot;/Scripts/jquery-1.4.min.js&quot;&lt;span style=&#39;color:red&#39;&gt;type&lt;span style=&#39;color:blue&#39;&gt;=&quot;text/javascript&quot;&amp;gt;&amp;lt;/&lt;span style=&#39;color:maroon&#39;&gt;script&lt;span style=&#39;color:blue&#39;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;или
&lt;/p&gt;&lt;p&gt;&lt;span style=&#39;color:blue&#39;&gt;&lt;span style=&#39;font-family:Consolas; font-size:9pt&#39;&gt;&amp;lt;&lt;span style=&#39;color:maroon&#39;&gt;script&lt;span style=&#39;color:red&#39;&gt;src&lt;span style=&#39;color:blue&#39;&gt;=&quot;&lt;a href=&#39;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&#39;&gt;&lt;span style=&#39;color:#ff7700&#39;&gt;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&lt;/span&gt;&lt;/a&gt;&quot;&lt;span style=&#39;color:black&#39;&gt; &lt;span style=&#39;color:red&#39;&gt;type&lt;span style=&#39;color:blue&#39;&gt;=&quot;text/javascript&quot;&amp;gt;&amp;lt;/&lt;span style=&#39;color:maroon&#39;&gt;script&lt;span style=&#39;color:blue&#39;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Теперь наш тестовый HTML. Как можно увидеть список стран заранее заполнен и по-умолчанию выбрано пустое значение.
&lt;/p&gt;&lt;p&gt;&lt;span style=&#39;color:black&#39;&gt;&lt;span style=&#39;font-family:Consolas; font-size:9pt&#39;&gt;&amp;lt;table&amp;gt;&lt;br/&gt; &amp;lt;tr&amp;gt;&lt;br/&gt;  &amp;lt;th&amp;gt;Country:&amp;lt;/th&amp;gt;&lt;br/&gt;  &amp;lt;td&amp;gt;&lt;br/&gt;   &amp;lt;select id=&lt;span style=&#39;color:#006080&#39;&gt;&quot;countries&quot;&lt;span style=&#39;color:black&#39;&gt;&amp;gt;&lt;br/&gt;    &amp;lt;option&amp;gt; -- Select a Country -- &amp;lt;/option&amp;gt;&lt;br/&gt;    &amp;lt;option &lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt;=&lt;span style=&#39;color:#006080&#39;&gt;&quot;1&quot;&lt;span style=&#39;color:black&#39;&gt;&amp;gt;United States&amp;lt;/option&amp;gt;&lt;br/&gt;    &amp;lt;option &lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt;=&lt;span style=&#39;color:#006080&#39;&gt;&quot;2&quot;&lt;span style=&#39;color:black&#39;&gt;&amp;gt;Canada&amp;lt;/option&amp;gt;&lt;br/&gt;    &amp;lt;/select&amp;gt;&lt;br/&gt;  &amp;lt;/td&amp;gt;&lt;br/&gt; &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br/&gt;  &amp;lt;th&amp;gt;State:&amp;lt;/th&amp;gt;&lt;br/&gt;  &amp;lt;td&amp;gt;&amp;lt;select id=&lt;span style=&#39;color:#006080&#39;&gt;&quot;states&quot;&lt;span style=&#39;color:black&#39;&gt;&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;/td&amp;gt;&lt;br/&gt; &amp;lt;/tr&amp;gt;&lt;br/&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Это наш контроллер, который будет снабжать нас странами и областями для выбранной страны
&lt;/p&gt;&lt;p&gt;&lt;span style=&#39;color:black; font-family:Consolas; font-size:9pt&#39;&gt; var list = &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; &lt;span style=&#39;color:blue&#39;&gt;object&lt;span style=&#39;color:black&#39;&gt;[] {};
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&#39;color:black&#39;&gt;&lt;span style=&#39;font-family:Consolas; font-size:9pt&#39;&gt; &lt;span style=&#39;color:blue&#39;&gt;switch&lt;span style=&#39;color:black&#39;&gt; (countryID) {&lt;br/&gt;  &lt;span style=&#39;color:blue&#39;&gt;case&lt;span style=&#39;color:black&#39;&gt; 1:&lt;br/&gt;   list = &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; &lt;span style=&#39;color:blue&#39;&gt;object&lt;span style=&#39;color:black&#39;&gt;[] {&lt;br/&gt;    &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; { &lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt; = 1, name = &lt;span style=&#39;color:#006080&#39;&gt;&quot;Alabama&quot;&lt;span style=&#39;color:black&#39;&gt; },&lt;br/&gt;    &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; { &lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt; = 2, name = &lt;span style=&#39;color:#006080&#39;&gt;&quot;Alaska&quot;&lt;span style=&#39;color:black&#39;&gt; },&lt;br/&gt;    &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; { &lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt; = 3, name = &lt;span style=&#39;color:#006080&#39;&gt;&quot;California&quot;&lt;span style=&#39;color:black&#39;&gt; }&lt;br/&gt;   };&lt;br/&gt;   &lt;span style=&#39;color:blue&#39;&gt;break&lt;span style=&#39;color:black&#39;&gt;;&lt;br/&gt;  &lt;span style=&#39;color:blue&#39;&gt;case&lt;span style=&#39;color:black&#39;&gt; 2:&lt;br/&gt;   list = &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; &lt;span style=&#39;color:blue&#39;&gt;object&lt;span style=&#39;color:black&#39;&gt;[] {&lt;br/&gt;    &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; { &lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt; = 1, name = &lt;span style=&#39;color:#006080&#39;&gt;&quot;Ontario&quot;&lt;span style=&#39;color:black&#39;&gt; },&lt;br/&gt;    &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; { &lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt; = 2, name = &lt;span style=&#39;color:#006080&#39;&gt;&quot;Quebec&quot;&lt;span style=&#39;color:black&#39;&gt; },&lt;br/&gt;    &lt;span style=&#39;color:blue&#39;&gt;new&lt;span style=&#39;color:black&#39;&gt; { &lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt; = 3, name = &lt;span style=&#39;color:#006080&#39;&gt;&quot;Nova Scotia&quot;&lt;span style=&#39;color:black&#39;&gt; }&lt;br/&gt;   };&lt;br/&gt;   &lt;span style=&#39;color:blue&#39;&gt;break&lt;span style=&#39;color:black&#39;&gt;;&lt;br/&gt; };&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#39;font-family:Times New Roman; font-size:12pt&#39;&gt;
     &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&#39;color:black; font-family:Consolas; font-size:9pt&#39;&gt; &lt;span style=&#39;color:blue&#39;&gt;return&lt;span style=&#39;color:black&#39;&gt; Json(list);&lt;br/&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Значение специально захардкожены для простоты демонстрации. В реально жизни их стоить грузить из, например, базы данных или xml файла. Обратите внимание на сигнатуру метода. Мы принимаем единственный параметр countryID, который определяет какие данные должны быть возвращены. Мы также установили тип возвращаемого значения в JsonResult. Это означает, что объект, возвращаемый из метода будет сериализован как JSON объект, который может быть легко использован из jQuery. Закончив с контроллером перейдем к коду jQuery.
&lt;/p&gt;&lt;p&gt;&lt;span style=&#39;color:black; font-family:Consolas; font-size:9pt&#39;&gt;&amp;lt;script type=&lt;span style=&#39;color:#006080&#39;&gt;&quot;text/javascript&quot;&lt;span style=&#39;color:black&#39;&gt;&amp;gt;&lt;br/&gt; $(document).ready(function() {    &lt;br/&gt;  $(&lt;span style=&#39;color:#006080&#39;&gt;&quot;#countries&quot;&lt;span style=&#39;color:black&#39;&gt;).change(function() {     &lt;br/&gt;   $.post(&lt;span style=&#39;color:#006080&#39;&gt;&quot;/Home/GetStates/&quot;&lt;span style=&#39;color:black&#39;&gt;, { countryID: $(&lt;span style=&#39;color:blue&#39;&gt;this&lt;span style=&#39;color:black&#39;&gt;).val() }, function(data) {&lt;br/&gt;    populateDropdown($(&lt;span style=&#39;color:#006080&#39;&gt;&quot;#states&quot;&lt;span style=&#39;color:black&#39;&gt;), data);&lt;br/&gt;   });&lt;br/&gt;  });&lt;br/&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&#39;color:black&#39;&gt;&lt;span style=&#39;font-family:Consolas; font-size:9pt&#39;&gt; function populateDropdown(select, data) {&lt;br/&gt;  select.html(&lt;span style=&#39;color:#006080&#39;&gt;&#39;&#39;&lt;span style=&#39;color:black&#39;&gt;);&lt;br/&gt;  $.each(data, function(id, option) {&lt;br/&gt;   select.append($(&lt;span style=&#39;color:#006080&#39;&gt;&#39;&amp;lt;option&amp;gt;&amp;lt;/option&amp;gt;&#39;&lt;span style=&#39;color:black&#39;&gt;).val(option.&lt;span style=&#39;color:blue&#39;&gt;value&lt;span style=&#39;color:black&#39;&gt;).html(option.name));&lt;br/&gt;  });       &lt;br/&gt; }&lt;br/&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#39;font-family:Times New Roman; font-size:12pt&#39;&gt;
     &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Разберем его.  Сначала мы привязываем событие к выпадающему списку с выбором страны. Когда происходит это событие мы выполняем ассинхронный запрос метода GetStates контроллера Home. Выбранное значение страны передается в метод как переменная: &lt;strong&gt;{ countryID: $(this).val() }. &lt;/strong&gt;Когда мы получаем ответ мы передаем полученные данные в функцию populateDropdown, которая очищает выпадающий список штатов и областей и заполняет его новыми значениями посреством добавления элемента &lt;strong&gt;option&lt;/strong&gt; и установки его параметров &lt;strong&gt;value&lt;/strong&gt; и &lt;strong&gt;text&lt;/strong&gt;.
&lt;/p&gt;&lt;p&gt;Код проекта можно скачать по ссылке ниже: 
&lt;/p&gt;&lt;p&gt;&lt;a href=&#39;http://www.codecapers.com/file.axd?file=2010%2f1%2fDynamicDropDown.zip&#39;&gt;DynamicDropDown.zip (37.28 kb)&lt;/a&gt;
   &lt;/p&gt;&lt;p&gt;Перевод статьи &lt;a href=&#39;http://www.codecapers.com/post/Dynamic-Select-Lists-with-MVC-and-jQuery.aspx&#39;&gt;Dynamic Select Lists with MVC and jQuery&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/912877221889182668/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/912877221889182668' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/912877221889182668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/912877221889182668'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2010/01/aspnet-mvc-jquery-dynamic-dropdowns.html' title='ASP.NET MVC и jQuery – Dynamic DropDowns'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-1909729909226578111</id><published>2010-01-24T03:54:00.008+03:00</published><updated>2010-01-24T04:36:01.075+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="32bit"/><category scheme="http://www.blogger.com/atom/ns#" term="4gb"/><category scheme="http://www.blogger.com/atom/ns#" term="ram"/><category scheme="http://www.blogger.com/atom/ns#" term="windows 7"/><title type='text'>Windows 7 32 bit - 4GB of RAM</title><content type='html'>Всем давно известно, что 32-битная версия ОС не может адресовать 4GB памяти. Даже если их установить в систему будет видно всего-лишь около 3GB. Однако Windows Server 2008 32bit умеет видеть больше, а Windows 7 построена как раз на его ядре. Поддержка данной возможности отключена по лицензионным соображениям и есть метод ее включить.&lt;br/&gt;
&lt;br/&gt;
&lt;span style=&quot;font-weight:bold; color:red;&quot;&gt;Внимание! Описанный ниже метод влечет изменение ядра системы и может вызвать непредсказуемые последствия! В силу этих же причин загружаемый файл может определятся антивирусами как вредоносный! Используя этот метод вы полностью возлагаете на себя ответственность за последствия!&lt;/span&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Шаг 1&lt;/span&gt;&lt;br/&gt;
Загрузите файл: &lt;a href=&quot;http://narod.ru/disk/17208169000/4GB-7600.RTM.x86.04.08.2009.exe.html&quot;&gt;narod.ru&lt;/a&gt;, &lt;a href=&quot;http://rapidshare.com/files/327820821/4GB-7600.RTM.x86.04.08.2009.exe&quot;&gt;rapidshare.com&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Шаг 2&lt;/span&gt;&lt;br/&gt;
Запустив его вы увидите данное окно:&lt;br/&gt;
&lt;img style=&quot; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 425px; height: 175px;&quot; src=&quot;http://pallab.net/uploads/images/software/4gb_4.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;br/&gt;
В нем необходимо нажать на кнопку &quot;Разблокировать&quot;&lt;br/&gt;
&lt;br/&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Шаг 3&lt;/span&gt;&lt;br/&gt;
Через некоторое время появится сообщение об успешном завершении операции. После нажатия &quot;ОК&quot; отроется следующее окно:&lt;br/&gt;
&lt;img style=&quot;cursor:pointer; cursor:hand;width: 425px; height: 331px;&quot; src=&quot;http://pallab.net/uploads/images/software/4gb_1.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;br/&gt;
В нем нужно нажать клавишу &quot;Y&quot; для выполнения действий и &quot;Enter&quot; после их окончания. После этого компьютер должен перезагрузиться.&lt;br/&gt;
&lt;br/&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Шаг 4&lt;/span&gt;&lt;br/&gt;
После загрузки системы откройте меню &quot;Пуск&quot;, нажмите правой кнопкой на пункте &quot;Компьютер&quot; и выберите &quot;Свойства&quot;.&lt;br/&gt;
Если все прошло успешно в появившемся окне вы увидите, что теперь используются все 4GB памяти.&lt;br/&gt;
&lt;br/&gt;
В моем случае это выглядит так(256Mb забирает себе видеокарта).&lt;br/&gt;
&lt;img style=&quot;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTAoZabYC2I4P0A2Az7WxsmWRpwjDfuLLiqva3ANHqpH_CVZ8qZ5IYvZrAdn91wkCBeIGWiuxfxPMMUuxPIGK6p3fX7F_PbEx40BUwywgjFDdLk03tp9TUgK1q5B_7EliiQ-XsxAyzcN83/s1600/4bg32bit.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5430109093549219906&quot; /&gt;&lt;br/&gt;
&lt;br/&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Шаг 5(опциональный)&lt;/span&gt;&lt;br/&gt;
Чтобы уменьшить задержку автовыбора в меню загрузки ОС проделайте следующие действия:
Откройте меню &quot;Пуск&quot;, наберите &quot;msconfig&quot; и нажмите &quot;Enter&quot;. &lt;br/&gt;
В открывшемся окне выберите вкладку &quot;Загрузка&quot; и установите значение поля &quot;Таймаут&quot; в 3 секунды(меньше, к сожалению нельзя).&lt;br/&gt;
&lt;br/&gt;
&lt;span style=&quot;font-weight:bold;&quot;&gt;Шаг 6(опциональный)&lt;/span&gt;&lt;br/&gt;
Если на рабочем столе в правом углу появилась надпись &quot;Test Mode Windows 7 Build 7600&quot; то выполните следующие действия:&lt;br/&gt;
Откройте меню &quot;Пуск&quot;, введите &quot;mcbuilder&quot; и нажмите &quot;Enter&quot;. &lt;br/&gt;
Дождитесь закрытия открывшегося окна и перезагрузите компьютер.&lt;br/&gt;
&lt;br/&gt;
Информация взята с сайта &lt;a href=&quot;http://www.pallab.net/2009/12/30/enable-more-than-4gb-memory-in-windows-vista-7/&quot;&gt;pallab.net&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/1909729909226578111/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/1909729909226578111' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/1909729909226578111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/1909729909226578111'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2010/01/windows-7-32-bit-4gb-of-ram.html' title='Windows 7 32 bit - 4GB of RAM'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTAoZabYC2I4P0A2Az7WxsmWRpwjDfuLLiqva3ANHqpH_CVZ8qZ5IYvZrAdn91wkCBeIGWiuxfxPMMUuxPIGK6p3fX7F_PbEx40BUwywgjFDdLk03tp9TUgK1q5B_7EliiQ-XsxAyzcN83/s72-c/4bg32bit.PNG" height="72" width="72"/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-2179415517867174143</id><published>2009-01-05T05:37:00.006+03:00</published><updated>2009-01-05T05:54:27.464+03:00</updated><title type='text'>Самые интересные вопросы о .NET на StackOverFlow.com</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://stackoverflow.com/Content/Img/stackoverflow-logo-250.png&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 250px; height: 70px;&quot; src=&quot;http://stackoverflow.com/Content/Img/stackoverflow-logo-250.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
Приветствую всех.&lt;div&gt;Ниже я привожу список самых интересных для меня вопросов по тематике .NET с сайта &lt;a href=&quot;http://stackoverflow.com/&quot;&gt;stackoverflow.com&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;clear:both;&quot;&gt;
&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/8440/visual-studio-optimizations&quot;&gt;Оптимизация Visual Studio&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;
&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/122784/hidden-net-base-class-library-classes&quot;&gt;Редкоиспользуемые классы .NET Framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/28637/is-datetime-now-the-best-way-to-measure-a-functions-performance&quot;&gt;Есть ли способ лучше DateTime.Now для измерения производительности приложения?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/138367/most-wanted-feature-for-c-4-0&quot;&gt;Самая желаемая новая возможность C# 4.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/54929/hidden-features-of-asp-net&quot;&gt;Скрытые возможность ASP.NET&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/201450/visual-studio-debugger-tips-tricks-for-net&quot;&gt;Отладка в Visual Studio - трюки и советы&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/144833/most-useful-attributes-in-c&quot;&gt;Самые полезные аттрибуты C#&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/233648/what-is-the-most-useful-net-library-youve-found&quot;&gt;Самые полезные .NET библиотеки&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/8676/entity-framework-vs-linq-to-sql&quot;&gt;Entity Framework VS LINQ to SQL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/178524/most-useful-net-utility-classes-developers-tend-to-reinvent-rather-than-reuse&quot;&gt;&quot;Велосипеды&quot;, которые уже написаны&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Перевод статьи &lt;a href=&quot;http://blog.sb2.fr/post/2009/01/02/Most-Interesting-NET-StackOverFlow-Questions.aspx&quot;&gt;Most Interesting .NET StackOverFlow Questions&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/2179415517867174143/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/2179415517867174143' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/2179415517867174143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/2179415517867174143'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2009/01/net-stackoverflowcom.html' title='Самые интересные вопросы о .NET на StackOverFlow.com'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-1247795990560929931</id><published>2008-11-13T01:04:00.004+03:00</published><updated>2008-11-13T01:14:10.931+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><category scheme="http://www.blogger.com/atom/ns#" term="os x"/><category scheme="http://www.blogger.com/atom/ns#" term="switcher"/><category scheme="http://www.blogger.com/atom/ns#" term="ui"/><category scheme="http://www.blogger.com/atom/ns#" term="vista"/><title type='text'>Switcher - Аналог Expose под Windows Vista</title><content type='html'>&lt;p&gt;В скором будущем, когда позволит финансовая ситуация, я стану свитчером - перейду на Mac OS X. Сейчас же денег нет и я пытаюсь сформировать макоподобный интерфейс в Windows Vista. &lt;/p&gt;&lt;p&gt;И вроде почти ни с чем проблем не было - кроме так называемого Expose. Но после некоторого времени, проведенного в гугле и отбрасыванием бесполезных/умерших утилит я наткунлся на программу под приятным мне названием - &lt;a href=&quot;http://insentient.net/Index.html&quot;&gt;Switcher&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;По функционалу - тот же Expose но еще более настраиваемый. Что не менее отрадно - полностью бесплатно. Позволяет активировать функцию из угла экрана либо по сочетанию клавиш(можно даже оверрайдить Win+Tab). Единственное требование Windows Vista с работающим Aero.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/1247795990560929931/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/1247795990560929931' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/1247795990560929931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/1247795990560929931'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/11/switcher-expose-windows-vista.html' title='Switcher - Аналог Expose под Windows Vista'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-6979833296929689163</id><published>2008-11-04T03:26:00.004+03:00</published><updated>2008-11-04T03:30:55.541+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c# 4.0"/><category scheme="http://www.blogger.com/atom/ns#" term="generic"/><category scheme="http://www.blogger.com/atom/ns#" term="generic covariance"/><title type='text'>Новые возможности C# 4.0. Часть 3: Ковариантность обобщений</title><content type='html'>&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;p&gt;Когда обобщения(generic) пришли к нам вместе с C# 2.0, они стали одной из лучших возможностей в этом языке. Те, кто когда-либо создавал классы строготипизированных коллекций в C# 1.0 знает, насколько они упростили нам жизнь и уменьшили количество кода. Единственная проблема заключалась в том, что обобщенные типы не следовали тем же правилам наследования, которые были в силе для обычных типов. Начнем, пожалуй с определения двух простых классов, которые мы будем использовать в этой статье:&lt;/p&gt;  &lt;div class=&quot;csharpcode&quot;&gt;   &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Shape&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;}&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt; &lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Circle : Shape&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt; Это классическая иерархия классов, которая пока ничего конкретного не делает, но это нам сейчас и не нужно. Теперь определим dummy-класс, который может быть контейнером для любого типа.&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;interface&lt;/span&gt; IContainer&amp;lt;T&amp;gt;&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    T GetItem();&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;}&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt; &lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Container&amp;lt;T&amp;gt;: IContainer&amp;lt;T&amp;gt; &lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; T item;&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt; &lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; Container(T item)&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;    {&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.item = item;&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:  &lt;/span&gt; &lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; T GetItem()&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:  &lt;/span&gt;    {&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; item;&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:  &lt;/span&gt;    }&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;У нас есть иерархия и контейнер. Теперь посмотрим на то, что мы сейчас не можем делать в текущей версии C# - 3.0.&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Main(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{            &lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    IContainer&amp;lt;Shape&amp;gt; list = GetList();&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;}&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt; &lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; IContainer&amp;lt;Shape&amp;gt; GetList()&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Container&amp;lt;Circle&amp;gt;(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Circle());&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;У нас есть метод GetList, у которого тип возращаемого значения определен как IContainer&amp;lt;Shape&amp;gt;, а возвращает он Container&amp;lt;Circle&amp;gt;. Так как Circle наследуется от Shape, а Container реализует интерфейс IContainer может показаться, что это сработает. Но, как вы догадались, C# 3.0 на это не способен.&lt;/p&gt;&lt;p&gt;В C# 4.0 у нас есть путь заставить это работать - нам нужно просто добавить ключевое слово out к параметру-типу в нашем определении интерфейса IContainer (замечу, что ковариантность в C# 4.0 ограничена интерфейсами и делегатам).&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;interface&lt;/span&gt; IContainer&amp;lt;&lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; T&amp;gt;&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    T GetItem();&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Данная конструкция говорит компилятору, что тип T ковариантен, что означет то, что любой IContainer&amp;lt;T&amp;gt; будет принимать любой тип эквивалентный или более конкретный, чем T. Как мы видели выше, типом возвращаемого значения был IContainer&amp;lt;Shape&amp;gt;, но если мы поставим параметр out к нашему интерфейсу, то мы легко сможем вернуть и IContainer&amp;lt;Circle&amp;gt;.&lt;/p&gt;&lt;p&gt;Так почему же решено использовать ключевое слово out? Все потому, что когда вы определяете параметр-тип как ковариантный вы сможете только вернуть этот тип из интерфейса. Например такая контрукция недопустима:&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;interface&lt;/span&gt; IContainer&amp;lt;&lt;span class=&quot;kwrd&quot;&gt;out&lt;/span&gt; T&amp;gt;&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; SetItem(T item);&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    T GetItem();&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Но почему это не будет работать? Ответ на самом деле очень прост - безопасность типов. Давайте посмотрим на последствия того, что мы сделали:&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Main(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    IContainer&amp;lt;Shape&amp;gt; container = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Container&amp;lt;Circle&amp;gt;();&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    SetItem(container);&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;}&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt; &lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; SetItem(IContainer&amp;lt;Shape&amp;gt; container)&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;    container.SetItem(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Square()); &lt;span class=&quot;rem&quot;&gt;// BOOM!!!&lt;/span&gt;&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Так как T ковариантен и, поэтому, мы можем присвоить Container&amp;lt;Circle&amp;gt; к переменной типа IContainer&amp;lt;Shape&amp;gt;, передав его дальше в наш статический метод SetItem, который принимает параметр типа IContainer&amp;lt;Shape&amp;gt; и, затем мы берем этот парметр и пытаемся добавить переменную типа Square в него. Кажется, что все верно - тип параметра IContainer&amp;lt;Shape&amp;gt; и это дает нам право добавить в него Square. Неверно. Это выражение &quot;взорвется&quot;, так как мы пытаемся добавить Square в контейнер, который держит Circle. Поэтому, ключевым словом out, они ограничили ковариантность только одним направлением.&lt;/p&gt;&lt;p&gt;Вам, наверное, интересно как это все реализовано в CLR 4.0? В реализации нет нужды. Обобщенные типы работали в CLR 2.0 и они уже позволяли подобное поведение. Так как C# пытался сохранить безопасность типов - нам такое не дозволялось, но CLR справляется с этим на раз. И, небольшая ремарка - массивы в C# позволяют такое поведение, так что попробуйте. Я надеюсь, что вам понравилась эта статья и новая в этой серии не за горами!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Перевод статьи &lt;/strong&gt;&lt;a href=&quot;http://www.codethinked.com/post/2008/10/31/C-40-New-Features-Part-3-Generic-Covariance.aspx&quot;&gt;&lt;strong&gt;C# 4.0 New Features Part 3 - Generic Covariance&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/6979833296929689163/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/6979833296929689163' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/6979833296929689163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/6979833296929689163'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/11/c-40-3.html' title='Новые возможности C# 4.0. Часть 3: Ковариантность обобщений'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-3697517742286357388</id><published>2008-11-03T03:55:00.004+03:00</published><updated>2008-11-03T04:03:59.859+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="fall update"/><category scheme="http://www.blogger.com/atom/ns#" term="nxe"/><category scheme="http://www.blogger.com/atom/ns#" term="xbox 360"/><title type='text'>Xbox 360 NXE: Второе рождение Xbox 360</title><content type='html'>&lt;p&gt;19 ноября Microsoft выпустит обновление для интерфейса игровой приставки Xbox 360 - NXE. Это действительно крупное обновление, которое будет включать в себя следующие изменения:&lt;/p&gt;  &lt;h4&gt;Обновленный интерфейс &lt;/h4&gt;  &lt;p&gt;Переработана группировка меню - больше не придется искать куда же положился ваш свежескачанный ролик или демоверсия. Кроссылки в интерфейсе, например переходы от описания в новости, непосредственно к покупке.&lt;/p&gt;  &lt;p&gt;Визуальное представление также улучшено - интерфейс теперь несколько напоминает CoverFlow из iTunes. И, естественно, он стал более красивым.&lt;/p&gt;  &lt;h4&gt;Установка игр на жесткий диск &lt;/h4&gt;  &lt;p&gt;Благодаря этому изменению происходит существенное ускорение загрузки игр. Многие игры, например GTA IV, избавляются от лагов при загрузке текстур в тяжелых местах. Уменьшается шум DVD-привода - чтение идет не с него, а с жесткого диска. Однако диск в приводе держать все же придется - еще одна защита от пиратов.&lt;/p&gt;  &lt;h4&gt;Аватар пользователя&lt;/h4&gt;  &lt;p&gt;Это человечек, которого будут видеть ваши друзья в своем в списке людей - идеологически полный аналог аватаров Wii Mii. Полностью кастомизируемый внешний вид - габариты, сложение, лицо, одежда - этакий Sims.&lt;/p&gt;  &lt;p&gt;И, напоследок, несколько видео.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Сравнение загрузки GTA IV с жесткого диска и с DVD-диска&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;embed src=&quot;http://www.youtube.com/v/Gc9tzrK5IbU&amp;amp;hl=ru&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&quot; width=&quot;425&quot; height=&quot;344&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Приветствие&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;embed src=&quot;http://www.youtube.com/v/lQixqoRgDKc&amp;amp;hl=ru&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&quot; width=&quot;425&quot; height=&quot;344&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Аватары&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;embed src=&quot;http://www.youtube.com/v/VExbd1oZ760&amp;amp;hl=ru&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x3a3a3a&amp;amp;color2=0x999999&quot; width=&quot;425&quot; height=&quot;344&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/3697517742286357388/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/3697517742286357388' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/3697517742286357388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/3697517742286357388'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/11/xbox-360-nxe-xbox-360.html' title='Xbox 360 NXE: Второе рождение Xbox 360'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-8838145848697649728</id><published>2008-11-03T01:19:00.003+03:00</published><updated>2008-11-03T01:23:27.511+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="asp.net mvc"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jquery"/><category scheme="http://www.blogger.com/atom/ns#" term="json"/><title type='text'>ASP.NET MVC + jQuery = рай для AJAX</title><content type='html'>&lt;p&gt;Я никогда раньше не имел дело ни с одним AJAX Toolkit от Microsoft, но недавно у меня появилась необходимость добавить картографический функционал к проекту, который я веду. Нам нужно было, чтобы у пользователей появилась возможность перемещать маркер по карте, а у нас получать его новые координаты на сервере. Очевидно, что нам для этого придется использовать AJAX в каком-либо виде. Сегодня я вам покажу насколько просто использовать связку ASP.NET MVC на сервере и jQuery на клиенте. Так как jQuery теперь включен в поставку ASP.NET MVC, то больше нет оправдания его не использовать.&lt;/p&gt;  &lt;p&gt;Возьмем очень простой пример. У нас есть страница на которой я хочу выводить список людей, когда я нажимаю кнопку &quot;Get people&quot; и добавлять нового человека в базу данных, вводя его имя и нажимая &quot;Add person&quot;. Вот как это выглядит:&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgU2wPXYIcamU7uTCtRvSFmtTZ8QuzWfO28Fl-07j1QhroA-ocxN0jMU1S09VsxSLfw1eluP_1ZMtBMzwj6zjozxyRCMmRCco-WO5OdwW81CvfvOdShv36T-B9Q0T3bQ_vNUhdBH2vJn0/[4].png&quot; /&gt;&lt;/p&gt;  &lt;p&gt;Для начала создадим кнопку &quot;Get people&quot; и список, в который будем загружать людей:&lt;/p&gt;  &lt;div class=&quot;csharpcode&quot;&gt;   &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;button&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;getPeople&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Get People&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;ul&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;people_list&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Далее напишем обработчик события &quot;страница загружена&quot;, который устанавливает обработчик клика по кнопке.&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;$(&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;() {&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    $(&lt;span class=&quot;str&quot;&gt;&quot;#getPeople&quot;&lt;/span&gt;).click(&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;() {&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;        $.getJSON(&lt;span class=&quot;str&quot;&gt;&quot;/Home/People&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;, getPeople);&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    });&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;});&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Когда кнопка нажата мы инициализирум запрос JSON данных с пути /Home/People, который мапится на метод People контроллера Home.&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;[AcceptVerbs(HttpVerbs.Get)]&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; ActionResult People()&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    var db = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DataClasses1DataContext();&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; Json(db.Persons);&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Все, что мы тут делаем - это получаем список людей из базы данных(с помощью LINQ to SQL) и возвращаем их в виде JSON. Когда ответ получен браузером вызывается функция getPeople, как у мы указали это в методе getJSON. Вот код функции getPeople:&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt; getPeople(people) {&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    $(&lt;span class=&quot;str&quot;&gt;&quot;#people_list&quot;&lt;/span&gt;).text(&lt;span class=&quot;str&quot;&gt;&quot;&quot;&lt;/span&gt;);&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    $.each(people, &lt;span class=&quot;kwrd&quot;&gt;function&lt;/span&gt;(i) {&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;        $(&lt;span class=&quot;str&quot;&gt;&quot;#people_list&quot;&lt;/span&gt;).append(&lt;span class=&quot;str&quot;&gt;&quot;&amp;lt;li&amp;gt;&quot;&lt;/span&gt; + &lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt;.Name + &lt;span class=&quot;str&quot;&gt;&quot;&amp;lt;/li&amp;gt;&quot;&lt;/span&gt;);&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;    });&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Данные, полученые от сервера приходят в нее в виде параметра people. Все что нам нужно сделать - это итереровать через коллекцию и для каждого ее элемента добавлять тег &amp;lt;li&amp;gt; в наш список людей. Как видите, взаимодействие ASP.NET MVC и jQuery реализуется очень просто - никакой ручной конвертации данных из объектов C# в объекты JavaScript делать не пришлось.&lt;/p&gt;&lt;p&gt;А что насчет обновления данных? Не менее просто. Для начала нам понадобится немного HTML кода: поле ввода и кнопка.&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;Name &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;text&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;name&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;br&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;button&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;addPerson&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;Add Person&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;И еще один обработчик нажатия кнопки.&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;$(&lt;span class=&quot;str&quot;&gt;&quot;#addPerson&quot;&lt;/span&gt;).click(function() {&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;    var name = $(&lt;span class=&quot;str&quot;&gt;&quot;#name&quot;&lt;/span&gt;)[0].&lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;;&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (name == &lt;span class=&quot;str&quot;&gt;&quot;&quot;&lt;/span&gt;) {&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;        alert(&lt;span class=&quot;str&quot;&gt;&quot;You must provide a name&quot;&lt;/span&gt;);&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt;;&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;    }&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;    var person = { Name: name };&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    $.post(&lt;span class=&quot;str&quot;&gt;&quot;/Home/People&quot;&lt;/span&gt;, person, &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;, &lt;span class=&quot;str&quot;&gt;&quot;json&quot;&lt;/span&gt;);&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;});&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;На этот раз мы использовали полезную функцию post, чтобы отправить наш свежесозданный объект JSON по адресу /Home/People методом POST. Так как используется метод POST, то этот запрос будет пойман нашим перегруженым методом People с атрибутом AcceptVerbs[HttpVerbs.Post].&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;[AcceptVerbs(HttpVerbs.Post)]&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; ActionResult People(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; Name)&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    var db = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; DataClasses1DataContext();&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;    var person = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Person {Name = Name};&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;    db.Persons.InsertOnSubmit(person);&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;    db.SubmitChanges();&lt;/pre&gt;  &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;;&lt;/pre&gt;  &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Все что нам приходится сделать на сервере, чтобы получить данные из запроса это назвать параметр этого метода также, как и поле нашего JSON объекта, то есть Name. ASP.NET MVC автоматически найдет соответсвие и отдаст нам нужные данные. Если вам нужно использовать сложный JSON объект, то вы можете десериализовать его, используя встроеный databinding. Осталось только создать объект для базы данных и сохранить его.&lt;/p&gt;&lt;p&gt;Я поздно занялся Ajax, но со связкой ASP.NET MVC + jQuery добавление такого функционала так же легко и приятно, как дуновение свежего ветра.&lt;/p&gt;&lt;p&gt;Демо-Solution вы можете скачать здесь: &lt;a href=&quot;http://static.mikehadlow.com/JQueryAjax.zip&quot;&gt;http://static.mikehadlow.com/JQueryAjax.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Перевод статьи &lt;/strong&gt;&lt;a href=&quot;http://mikehadlow.blogspot.com/2008/10/mvc-framework-and-jquery-ajax-heaven.html&quot;&gt;&lt;strong&gt;MVC Framework and jQuery = Ajax heaven&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/8838145848697649728/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/8838145848697649728' title='Комментарии: 110'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/8838145848697649728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/8838145848697649728'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/11/aspnet-mvc-jquery-ajax.html' title='ASP.NET MVC + jQuery = рай для AJAX'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>110</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-6742971986899569882</id><published>2008-11-02T14:49:00.000+03:00</published><updated>2008-11-02T14:50:47.688+03:00</updated><title type='text'>Новые возможности C# 4.0. Часть 2: параметры по умолчанию</title><content type='html'>&lt;p&gt;Сегодня мы поговорим о другой новинке C# 4.0, которую я ждал много лет. В  прошлом, ее отсутствие объяснялось архитектурным решением. Но, видимо,  прагматизм победил и теперь у нас есть параметры по умолчанию. Чтобы сделать их  еще более полезными они добавили к ним именованые параметры. Мы обсудим их через  пару минут, а сейчас займемся параметрами по умолчанию.&lt;/p&gt; &lt;p&gt;Предположим, что у нас есть такой класс:&lt;/p&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; TestClass&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; PerformOperation(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; val1, &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; val2, &lt;span class=&quot;kwrd&quot;&gt;double&lt;/span&gt; val3)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;{0},{1},{2}&quot;&lt;/span&gt;, val1, val2, val3);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Теперь мы можем инстанциировать его и вызвать метод:&lt;/p&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;var testClass = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TestClass();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;testClass.PerformOperation(&lt;span class=&quot;str&quot;&gt;&quot;val&quot;&lt;/span&gt;, 10, 12.2);&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;  Но, что, если мы знаем &quot;хорошие&quot; значения параметров, которые используются чаще  всего? До сего дня решением являлась перегрузка методов:&lt;/p&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; TestClass&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; PerformOperation()&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        PerformOperation(&lt;span class=&quot;str&quot;&gt;&quot;val&quot;&lt;/span&gt;, 10, 12.2);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;    &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; PerformOperation(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; val1)&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;        PerformOperation(val1, 10, 12.2);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt; &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; PerformOperation(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; val1, &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; val2)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  15:  &lt;/span&gt;        PerformOperation(val1, val2, 12.2);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  16:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  17:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  18:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; PerformOperation(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; val1, &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; val2, &lt;span class=&quot;kwrd&quot;&gt;double&lt;/span&gt; val3)&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  19:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  20:  &lt;/span&gt;        Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;{0},{1},{2}&quot;&lt;/span&gt;, val1, val2, val3);&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  21:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  22:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Довольно длинно. Но C# 4.0 дает нам лучшее решение:&lt;/p&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; TestClass&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; PerformOperation(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; val1 = &lt;span class=&quot;str&quot;&gt;&quot;val&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; val2 = 10, &lt;span class=&quot;kwrd&quot;&gt;double&lt;/span&gt; val3 = 12.2)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;{0},{1},{2}&quot;&lt;/span&gt;, val1, val2, val3);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt; &lt;style type=&quot;text/css&quot;&gt;    .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: consolas, &quot;Courier New&quot;, courier, monospace;  background-color: #ffffff;  /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  {  background-color: #f4f4f4;  width: 100%;  margin: 0em; } .csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;p&gt;Насколько это чище, а? Как же нам теперь вызывать этот метод? Да точно так  же, если бы это была перегрузка:&lt;/p&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;var testClass = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TestClass();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;testClass.PerformOperation(&lt;span class=&quot;str&quot;&gt;&quot;val&quot;&lt;/span&gt;, 10);&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Очень хорошо. Третий параметр в этом вызове приравнен к 12.2 по умолчанию.  Теперь VB.NET разработчики перестанут смеятся над нами. Более того, параметры по  умолчанию распространяются и на конструкторы:&lt;/p&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; TestClass&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; TestClass(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; someValue = &lt;span class=&quot;str&quot;&gt;&quot;testValue&quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt; &lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; PerformOperation(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; val1 = &lt;span class=&quot;str&quot;&gt;&quot;val&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; val2 = 10, &lt;span class=&quot;kwrd&quot;&gt;double&lt;/span&gt; val3 = 12.2)&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;        Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;{0},{1},{2}&quot;&lt;/span&gt;, val1, val2, val3);&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;  Больше никаких многократных перегрузок конструкторов!&lt;/p&gt; &lt;p&gt;А что случится, если мы опустим значение val2 в вызове метода, показаном  выше? Тоесть мы хотим указать val1 и val3, но оставить значение по умолчанию для  val2. Мы не можем сделать это так:&lt;/p&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;var testClass = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TestClass();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;testClass.PerformOperation(&lt;span class=&quot;str&quot;&gt;&quot;val&quot;&lt;/span&gt;, 10.2);&lt;/pre&gt;&lt;/div&gt; &lt;style type=&quot;text/css&quot;&gt;    .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: consolas, &quot;Courier New&quot;, courier, monospace;  background-color: #ffffff;  /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  {  background-color: #f4f4f4;  width: 100%;  margin: 0em; } .csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;p&gt;Этот код не скомпилируется, так как 10.2 не может быть приведено к int -  здесь C# пытается оставить по умолчанию третий параметр, а не второй, как нам  нужно. Итак, какой выход у нас есть? Мы можем использовать именованые параметры.  Они состоят из указания имени параметра, двоеточия и значения, которое мы  передаем. Тоесть вызов будет выглядеть так:&lt;/p&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;var testClass = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TestClass();&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;testClass.PerformOperation(&lt;span class=&quot;str&quot;&gt;&quot;val&quot;&lt;/span&gt;, val3: 10.2);&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;Довольно аккуратно, но меня смущает тот факт, что теперь смена имени  параметра будет нести такие кардинальные последствия. Я думаю только время  покажет насколько это удобно в разработке больших приложений. Хотя, люди,  работающие с другими языками живут с этим уже много лет.&lt;/p&gt; &lt;p&gt;Вот вам еще одна интересная новая возможность C# 4.0 и еще один повод  приглядываться к новой VS2010.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Перевод статьи: &lt;/strong&gt;&lt;a href=&quot;http://www.codethinked.com/post/2008/10/29/C-40-New-Features-Part-2-default-and-named-parameters.aspx&quot;&gt;&lt;strong&gt;C#  4.0 New Features Part 2 - default and named parameters&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/6742971986899569882/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/6742971986899569882' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/6742971986899569882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/6742971986899569882'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/11/c-40-2.html' title='Новые возможности C# 4.0. Часть 2: параметры по умолчанию'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-6359593829675377571</id><published>2008-11-01T15:24:00.006+03:00</published><updated>2008-11-01T16:32:46.116+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="c# 4.0"/><category scheme="http://www.blogger.com/atom/ns#" term="dynamic"/><category scheme="http://www.blogger.com/atom/ns#" term="pdc"/><title type='text'>Новые возможности C# 4.0. Часть 1: dynamic</title><content type='html'>&lt;p&gt;Одна из самых интересных возможностей язык C# 4.0, который был представлен на PDC является новое ключевое слово - &lt;em&gt;dynamic&lt;/em&gt;. Оно позволяет разработчику объявить объект, привязка к методам которого, будет осуществлятся на этапе выполнения, а не компиляции. Примечательно, что класс, который инстанциирует этот объект объявляется стандартным способом.&lt;/p&gt;  &lt;div class=&quot;csharpcode&quot;&gt;   &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; TestClass&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; TestMethod1()&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;        Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;test method 1&quot;&lt;/span&gt;);&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;    }&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt; &lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; TestMethod2()&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;        Console.WriteLine(&lt;span class=&quot;str&quot;&gt;&quot;test method 2&quot;&lt;/span&gt;);&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;    }        &lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Теперь мы можем вызывать его методы как обычно:&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;var test = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TestClass();&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;test.TestMethod1();&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;test.TestMethod2();&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Как мы и ожидали все прекрасно скомпилировалось. Теперь воспользуемся новым ключевым словом &lt;em&gt;dynamic:&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;dynamic test = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TestClass();&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;test.TestMethod1();&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;test.TestMethod2();&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ничего не изменилось? Отнюдь. Все точно так же компилируется, как и раньше, но теперь вызовы методов будут привязываться на этапе выполнения, а не компиляции. Тоесть, если мы напишем вот так:&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;dynamic test = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TestClass();&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;test.TestMethod1();&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;test.TestMethod2();&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;test.TestMethod3();&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Код все-равно успешно скомпилируется, но после запуска мы получим данное исключение:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.codethinked.com/image.axd?picture=WindowsLiveWriter/C4.0NewFeaturesPart1dynamickeyword_8736/image_3.png&quot; /&gt;&lt;/p&gt;&lt;p&gt;Что же тут произошло? Вот что нам подсказал Reflector:&lt;/p&gt;&lt;div class=&quot;csharpcode&quot;&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; Main(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt;[] args)&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;{&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt; test = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; TestClass();&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (&amp;lt;Main&amp;gt;o__SiteContainer0.&amp;lt;&amp;gt;p__Site1 == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;    {&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;        &amp;lt;Main&amp;gt;o__SiteContainer0.&amp;lt;&amp;gt;p__Site1 = CallSite&amp;lt;Action&amp;lt;CallSite, &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;&amp;gt;&amp;gt;.Create(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; CSharpCallPayload(Microsoft.CSharp.RuntimeBinder.RuntimeBinder.GetInstance(), &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;str&quot;&gt;&quot;TestMethod1&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;), &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;));&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;    }&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;    &amp;lt;Main&amp;gt;o__SiteContainer0.&amp;lt;&amp;gt;p__Site1.Target(&amp;lt;Main&amp;gt;o__SiteContainer0.&amp;lt;&amp;gt;p__Site1, test);&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   9:  &lt;/span&gt;    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (&amp;lt;Main&amp;gt;o__SiteContainer0.&amp;lt;&amp;gt;p__Site2 == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;)&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  10:  &lt;/span&gt;    {&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  11:  &lt;/span&gt;        &amp;lt;Main&amp;gt;o__SiteContainer0.&amp;lt;&amp;gt;p__Site2 = CallSite&amp;lt;Action&amp;lt;CallSite, &lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;&amp;gt;&amp;gt;.Create(&lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; CSharpCallPayload(Microsoft.CSharp.RuntimeBinder.RuntimeBinder.GetInstance(), &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;, &lt;span class=&quot;str&quot;&gt;&quot;TestMethod2&quot;&lt;/span&gt;, &lt;span class=&quot;kwrd&quot;&gt;typeof&lt;/span&gt;(&lt;span class=&quot;kwrd&quot;&gt;object&lt;/span&gt;), &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;));&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  12:  &lt;/span&gt;    }&lt;/pre&gt; &lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;  13:  &lt;/span&gt;    &amp;lt;Main&amp;gt;o__SiteContainer0.&amp;lt;&amp;gt;p__Site2.Target(&amp;lt;Main&amp;gt;o__SiteContainer0.&amp;lt;&amp;gt;p__Site2, test);&lt;/pre&gt; &lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;  14:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Для начала компилятор сгенерировал поле &lt;em&gt;o__SiteContainer0&lt;/em&gt;, для хранения информации о месте вызова. Если вы посмотрите на переменную &lt;em&gt;test&lt;/em&gt;, которая содержит наш объект, то увидите, что ее тип стал типом &lt;em&gt;object&lt;/em&gt;. Так что, в реальности, это не динамический тип, а всего-лишь помощник со стороны компилятора.&lt;/p&gt;&lt;p&gt;Дальше идет проверка мест вызова(&lt;em&gt;callsite) &lt;/em&gt;на &lt;em&gt;null &lt;/em&gt;и если они ему равны, то используется &lt;em&gt;CallSite.Create&lt;/em&gt;, в который передается объект &lt;em&gt;CSharpCallPayload&lt;/em&gt;, который содержит всю информацию о методе, который мы вызываем. Как только место вызова указано, то оно просто вызывается у нашей переменной &lt;em&gt;test&lt;/em&gt;. Как видите - компилятор все сделал за нас.&lt;/p&gt;&lt;p&gt;В данном примере то что мы делаем кажется чертовски бесполезным, но мощь этой возможности проявляется тогда, когда мы используем тип, методы которого мы не знаем на этапе компиляции. Это может прийти от динамических языков(например IronRuby), если это сгенерированный класс, или что угодно из того, для чего мы используем Reflection.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Ремарка: я принял рещение исключить из перевода часть про тестирование производительности, так как в статье &lt;a href=&quot;http://www.codethinked.com/post/2008/10/28/C-40-New-Features-Part-11-dynamic-keyword-second-look.aspx&quot;&gt;C# 4.0 New Features Part 1.1 - dynamic keyword second look&lt;/a&gt; автор провел новое тестирование и оно показало заметно лучшие результаты.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Перевод статьи &lt;/strong&gt;&lt;a href=&quot;http://www.codethinked.com/post/2008/10/28/C-40-New-Features-Part-1-dynamic-keyword.aspx&quot;&gt;&lt;strong&gt;C# 4.0 New Features Part 1 - dynamic keyword&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/6359593829675377571/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/6359593829675377571' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/6359593829675377571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/6359593829675377571'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/11/c-40-1-dynamic.html' title='Новые возможности C# 4.0. Часть 1: dynamic'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-1326134920945057679</id><published>2008-10-31T18:29:00.003+03:00</published><updated>2008-10-31T22:15:08.480+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="dbml"/><category scheme="http://www.blogger.com/atom/ns#" term="linq2sql"/><title type='text'>LINQ to SQL: обновление модели из базы данных</title><content type='html'>&lt;p&gt;Если вы используете LINQ to SQL в паре с его дизайнером вы наверняка в курсе его неприятного ограничения - невозможно обновить модель из базы данных.&lt;/p&gt;  &lt;p&gt;Как ни странно с того момента, как я последний раз изучал эту ситуацию - решение появилось:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.huagati.com/dbmltools/&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;&quot;&gt;Huagati DBML/EDMX Tools для Visual Studio 2008 / .net 3.5&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Вот в кратце возможности:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;LINQ to SQL&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Стандартизация имен классов и членов (удаление префиксов tbl_, int_, str_, приведение регистра символов)&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Обновление диаграмы дизайнера из базы данных&lt;/strong&gt;&lt;/li&gt;      &lt;li&gt;Обновление документации из базы данных&lt;/li&gt;      &lt;li&gt;Сравнение диаграмы дизайнера и базы данных&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;ADO.NET Entity Framework&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Стандартизация имен классов и членов (удаление префиксов tbl_, int_, str_, приведение регистра символов)&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;
&lt;strong&gt;UPDATE: к сожалению, выяснилось, что данная утилита платная - будем искать лекарство&lt;/strong&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/1326134920945057679/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/1326134920945057679' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/1326134920945057679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/1326134920945057679'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/10/linq-to-sql.html' title='LINQ to SQL: обновление модели из базы данных'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-4527003673606324292</id><published>2008-10-31T16:37:00.002+03:00</published><updated>2008-10-31T16:40:23.727+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net"/><category scheme="http://www.blogger.com/atom/ns#" term="best practices"/><category scheme="http://www.blogger.com/atom/ns#" term="mvc"/><category scheme="http://www.blogger.com/atom/ns#" term="unit testing"/><title type='text'>Unit Testing. Что это и чем это нам грозит?</title><content type='html'>&lt;p&gt;Благодаря &lt;em&gt;тлетворному&lt;/em&gt; влиянию прекрасного разработчика, моего коллеги, &lt;a href=&quot;http://mind-injection.blogspot.com/&quot;&gt;Никиты Говорова&lt;/a&gt; я начал изучать Best Practices. Первой из этих практик естественно стало модульное тестирование, к тому же в тот момент подоспел очередной preview ASP.NET MVC, а в месте с ним серия скринкастов &lt;a href=&quot;http://blog.wekeroad.com/mvc-storefront/&quot;&gt;MVC Storefront&lt;/a&gt;, с которыми я рекомендую ознакомиться, даже если вы не связаны с веб-разработкой.&lt;/p&gt;  &lt;p&gt;Итак, модульное тестирование. Концепцию удобнее показать на примере.&lt;/p&gt;  &lt;p&gt;Предположим, что перед нами стоит простая задача - написать целочисленный калькулятор. Как ни трудно догадаться основой его будет класс &lt;em&gt;Calculator&lt;/em&gt;, который мы с вами и будем писать. Для удобства создадим интерфейс &lt;em&gt;ICalculator&lt;/em&gt;, который покажет какие методы нам нужны:&lt;/p&gt;  &lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;color:blue;&quot;&gt;public interface &lt;/span&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;ICalculator
&lt;/span&gt;{
   &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;Add(&lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;first, &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;second);
   &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;Substract(&lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;first, &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;second);
   &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;Multiply(&lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;first, &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;second);
   &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;Divide(&lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;first, &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;second);
}&lt;/pre&gt;&lt;a href=&quot;http://11011.net/software/vspaste&quot;&gt;&lt;/a&gt;&lt;p&gt;Далее нам нужно реализовать этот интерфейс в классе &lt;em&gt;Calculator&lt;/em&gt;. Мы будем делать это поэтапно для каждого необходимого нам метода.&lt;/p&gt;&lt;h4&gt;Этап 1: Написание теста&lt;/h4&gt;&lt;p&gt;Да, как это парадоксально не звучит - сначала пишется тест, потом то, что тестируется. Это основное &quot;неудобство&quot; данной практики для новичков, так как очень сложно заставить писать тест еще до того, как написан сам код.&lt;/p&gt;&lt;p&gt;Для написания теста нам нужно добавить в наш &lt;em&gt;Solution&lt;/em&gt; новый проект типа &lt;em&gt;Test Project&lt;/em&gt;(в данной статье мы будем использовать встроенные тесты Visual Studio 2008).После его создания у нас появится класс &lt;em&gt;UnitTest1&lt;/em&gt; с атрибутом &lt;em&gt;[TestClass]&lt;/em&gt;, содержащий в себе метод &lt;em&gt;TestMethod1&lt;/em&gt; с атрибутом &lt;em&gt;[TestMethod]&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Для начала переименуем метод во что-нибудь более удобоваримое, например в &lt;em&gt;Calculator_Add_MustAddFirstIntToSecondAndReturnTheResult()&lt;/em&gt;. Не пугайтесь такого длинного названия - вызывать напрямую этот метод вам нигде не придется, но это добавит ясность к тесту в том случае, когда их у вас в проекте станет несколько сотен. Основная идея - назвать метод так, чтобы по названию стало ясно, что он делает(тестирует).&lt;/p&gt;&lt;p&gt;&lt;em&gt;Небольшая ремарка: Мой коллега Никита Говоров недавно предложил воспользоваться возможностью C# и писать название тестовых методов на русском языке. Это спорное с моей точки зрения решение, так как может вызвать труднонаходимые опечатки из-за переключения раскладки, но если у вас есть сложности с английским языком, то попробуйте - возможно это то, что вам нужно.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Теперь собственно напишем сам тест, который будет тестировать работу метода &lt;em&gt;Add&lt;/em&gt;.&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;[&lt;span style=&quot;color:#2b91af;&quot;&gt;TestMethod&lt;/span&gt;]
&lt;span style=&quot;color:blue;&quot;&gt;public void &lt;/span&gt;Calculator_Add_MustAddFirstIntToSecondAndReturnTheResult()
{
   &lt;span style=&quot;color:#2b91af;&quot;&gt;Calculator &lt;/span&gt;calculator = &lt;span style=&quot;color:blue;&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Calculator&lt;/span&gt;();

   &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;result = calculator.Add(1, 2);

   &lt;span style=&quot;color:#2b91af;&quot;&gt;Assert&lt;/span&gt;.AreEqual(3, result);
}&lt;/pre&gt;&lt;p&gt;Как видите - тут все просто. Мы создаем экземпляр класса &lt;em&gt;Calculator&lt;/em&gt;, и вызываем у него метод &lt;em&gt;Add&lt;/em&gt;, записывая результат. Последняя инструкция - собственно проверка равен ли первый аргумент(тот, результат, который мы ожидаем) второму(результат, который мы получили). Если это не так - метод &lt;em&gt;Assert.AreEqual&lt;/em&gt; выбросит исключение. Тест считается пройденным(&lt;em&gt;Passed&lt;/em&gt;), если не было выброшено ни одного исключения.&lt;/p&gt;&lt;h4&gt;Этап 2: Провалим тест&lt;/h4&gt;&lt;p&gt;На этом этапе мы должны убедится, что то что мы собираемся проверять - действительно это проверяет. Так как мы еще не реализовали сам метод &lt;em&gt;Add&lt;/em&gt; запуск теста приведет к провалу(&lt;em&gt;Failed&lt;/em&gt;), что нам и нужно. Запуск теста осуществляется кликом по телу метода и вызовом команды контекстного меню &lt;em&gt;Run Tests&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Это может показаться излишним, но действительно довольно часто встречаются ситуации, когда тестовый проходит(&lt;em&gt;Passed&lt;/em&gt;), хотя никаких условий этому не обеспечено. Например вы можете ошибиться и проверять вместо длины коллекции возвращенных объектов методом &lt;em&gt;Assert.AreNotEqual(0, collection.Length)&lt;/em&gt; ее неравность &lt;em&gt;null&lt;/em&gt; методом &lt;em&gt;Assert.IsNotNull(collection)&lt;/em&gt;. При количестве элементов равном нулю ваш тест пройдет, хотя должен быть &lt;em&gt;Failed&lt;/em&gt;.&lt;/p&gt;&lt;h4&gt;Этап 3: Реализуем метод&lt;/h4&gt;&lt;p&gt;На этом этапе с одной стороны все просто, с другой - не очень. Необходимо написать минимальный функционал, благодаря которому тест пройдет. Для примера возьмем метод &lt;em&gt;Divide&lt;/em&gt;. Мы уже написали для него тест на предыдущем этапе:&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;[&lt;span style=&quot;color:#2b91af;&quot;&gt;TestMethod&lt;/span&gt;]
&lt;span style=&quot;color:blue;&quot;&gt;public void &lt;/span&gt;Calculator_Divide_MustDivideFirstIntBySecondAndReturnTheResult()
{
   &lt;span style=&quot;color:#2b91af;&quot;&gt;Calculator &lt;/span&gt;calculator = &lt;span style=&quot;color:blue;&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Calculator&lt;/span&gt;();

   &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;result = calculator.Divide(4, 2);

   &lt;span style=&quot;color:#2b91af;&quot;&gt;Assert&lt;/span&gt;.AreEqual(2, result);
}&lt;/pre&gt;&lt;p&gt;В момент реализации самого метода вы можете подумать: &quot;Черт, а ведь на ноль делить нельзя - надо добавить проверку&quot;. И будете не правы, так как ваш тест не учитывает этого функционала. Для написания такого функционала нужно написать еще один тест:&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;[&lt;span style=&quot;color:#2b91af;&quot;&gt;TestMethod&lt;/span&gt;]
&lt;span style=&quot;color:blue;&quot;&gt;public void &lt;/span&gt;Calculator_Divide_MustCheckSecondArgumentOnZeroAndThrowExceptionIfTrue()
{
   &lt;span style=&quot;color:#2b91af;&quot;&gt;Calculator &lt;/span&gt;calculator = &lt;span style=&quot;color:blue;&quot;&gt;new &lt;/span&gt;&lt;span style=&quot;color:#2b91af;&quot;&gt;Calculator&lt;/span&gt;();

   &lt;span style=&quot;color:blue;&quot;&gt;bool &lt;/span&gt;catched = &lt;span style=&quot;color:blue;&quot;&gt;false&lt;/span&gt;;

   &lt;span style=&quot;color:blue;&quot;&gt;try
   &lt;/span&gt;{
       &lt;span style=&quot;color:blue;&quot;&gt;int &lt;/span&gt;result = calculator.Divide(4, 0);
   }
   &lt;span style=&quot;color:blue;&quot;&gt;catch &lt;/span&gt;(&lt;span style=&quot;color:#2b91af;&quot;&gt;Exception &lt;/span&gt;ex)
   {
       &lt;span style=&quot;color:#2b91af;&quot;&gt;Assert&lt;/span&gt;.IsInstanceOfType(ex, &lt;span style=&quot;color:blue;&quot;&gt;typeof &lt;/span&gt;(&lt;span style=&quot;color:#2b91af;&quot;&gt;ArgumentException&lt;/span&gt;));
       catched = &lt;span style=&quot;color:blue;&quot;&gt;true&lt;/span&gt;;
   }
   &lt;span style=&quot;color:#2b91af;&quot;&gt;Assert&lt;/span&gt;.IsTrue(catched, &lt;span style=&quot;color:#a31515;&quot;&gt;&quot;No exception throwed - something wrong&quot;&lt;/span&gt;);
}&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;http://11011.net/software/vspaste&quot;&gt;&lt;/a&gt;И только после этого реализовывайте соответствующий функционал.&lt;/p&gt;&lt;h4&gt;Этап 4: Проходим тест&lt;/h4&gt;&lt;p&gt;Последний этап самый простой - убедится что тест прошел.&lt;/p&gt;&lt;h4&gt;Заключение&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: normal; &quot;&gt;&lt;/span&gt;&lt;/h4&gt;&lt;h4&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: normal; &quot;&gt;Как видите использование данной практики связано с большим расходом времени(нормальное соотношение строк кода к тестам - 1:2) и очень большой силой самоконтроля - непросто заставить себя идти ровно по шагам не забегая вперед тестов. Но - это того стоит. Во время написания тестов находится много потенциальных логических ошибок, которые в противном случае всплыли бы на этапе выполнения.&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;В этой статье мы использовали &lt;em&gt;Unit Test Framework&lt;/em&gt;, который идет в комплекте с Visual Studio. В следующей статье мы рассмотрим альтернативный - MbUnit.&lt;/p&gt;&lt;p&gt;До новых встреч.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/4527003673606324292/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/4527003673606324292' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/4527003673606324292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/4527003673606324292'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/10/unit-testing.html' title='Unit Testing. Что это и чем это нам грозит?'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-1852996023745257270</id><published>2008-10-31T11:45:00.003+03:00</published><updated>2008-10-31T12:05:05.616+03:00</updated><title type='text'>Стимул</title><content type='html'>&lt;p&gt;Давным-давно по моему летоисчислению я начал вести этот блог. И даже смог из себя выдавить пару статей, одна из которых, даже помогла кому-то. Но, как и все мои другие начинания, мне стало лень/нет времени его вести.&lt;/p&gt;&lt;p&gt;И так бы ничего и не изменилось, если бы не одно событие, показавшее мне, что это все-таки не зря - вести блог. Ходя по форуму sql.ru в перерыве на работе я заметил топик про уже описаный мною продукт - UrlRewriting.NET. И, как это было для меня неожидано, увидел в нем ссылку, ведущую на блог, который вы сейчас читаете.&lt;/p&gt;&lt;p&gt;Вроде мелочь, скажете вы, и я с вами соглашусь. Но эта мелочь - тот стимул, которого мне не хватало.&lt;/p&gt;&lt;p&gt;Этот пост - всего-лишь вступление, попытка вспомнить клавиатуру и разговорный язык - на ближайшее время я наметил пару статей по юнит-тестированию в .NET и целом и в ASP.NET MVC в частности. Также, вероятно, мы с вами коснемся различных паттернов проектирования, как то Repository, IoC и, возможно, других, если я найду их для себя интересными и применимыми в своей реальной жизни.&lt;/p&gt;&lt;p&gt;До скорых встреч, коллеги!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/1852996023745257270/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/1852996023745257270' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/1852996023745257270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/1852996023745257270'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2008/10/blog-post.html' title='Стимул'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-2652872787228679307</id><published>2007-09-17T03:01:00.001+04:00</published><updated>2007-09-29T23:26:57.637+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="membership"/><category scheme="http://www.blogger.com/atom/ns#" term="password"/><title type='text'>Membership. Смена пароля без ввода старого</title><content type='html'>&lt;p&gt;Используя стандартный Membership у меня возникла необходимость смены пароля без ввода старого, но к сожалению метод ChangePassword требует два аргумента - старый и новый пароль.&lt;/p&gt; &lt;p&gt;Пришлось обойти это вот так:&lt;/p&gt; &lt;div class=&quot;CodeFormatContainer&quot;&gt; &lt;style&gt;&lt;br /&gt;&lt;!-- .csharpcode, .csharpcode pre {  font-size: small;  color: black;  font-family: consolas, &quot;Courier New&quot;, courier, monospace;  background-color: #ffffff;  /*white-space: pre;*/ }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  background-color: #f4f4f4;  width: 100%;  margin: 0em; }  .csharpcode .lnum { color: #606060; }  --&gt;&lt;br /&gt;&lt;/style&gt; &lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; tempPWD = Membership.GetUser().ResetPassword();
Membership.GetUser().ChangePassword(tempPWD, pwdTB.Text);&lt;/pre&gt;&lt;pre class=&quot;csharpcode&quot;&gt; &lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/2652872787228679307/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/2652872787228679307' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/2652872787228679307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/2652872787228679307'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2007/09/membership.html' title='Membership. Смена пароля без ввода старого'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-8291478019899211690</id><published>2007-01-15T17:29:00.001+03:00</published><updated>2007-01-15T17:32:53.568+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="nested repeater"/><category scheme="http://www.blogger.com/atom/ns#" term="repeater"/><title type='text'>Nested Repeater - Вложенныйе Repeater</title><content type='html'>&lt;p&gt;Очень часто при разработке веб-приложений приходится использовать двууровневую иерархию. Например вам нужно динамически вывести категории товаров и сами товары в категориях. Выглядеть это будет примерно так:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Рыба  &lt;ol&gt; &lt;li&gt;Форель  &lt;/li&gt;&lt;li&gt;Семга  &lt;/li&gt;&lt;li&gt;Окунь&lt;/li&gt;&lt;/ol&gt; &lt;/li&gt;&lt;li&gt;Мясо  &lt;ol&gt; &lt;li&gt;Говядина  &lt;/li&gt;&lt;li&gt;Свинина&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Обычно такие списки делаются с помощью Repeater. И действительно все что надо, что бы отобразить категории - пара строк кода:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:638a88e6-d83d-4427-a02a-d6ee7fd2a1f8&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre style=&quot;background-color: rgb(255, 255, 128); white-space: -moz-pre-wrap;&quot;&gt;&lt;div&gt;&lt;!--  Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/  --&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:Repeater &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt; ID&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;catRepeater&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
  &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;HeaderTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;HeaderTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
  &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ItemTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;%# DataBinder&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;.Eval(Container.DataItem, &quot;CategoryName&quot;)%&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ItemTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
  &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;FooterTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;FooterTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:Repeater&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;и
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:03a97062-cfe5-4eaa-8ee8-b0d2ed40d429&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre style=&quot;background-color: rgb(255, 255, 128); white-space: -moz-pre-wrap;&quot;&gt;&lt;div&gt;&lt;!--  Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/  --&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;protected&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; Page_Load(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; sender, EventArgs e)
{
  SqlConnection conn &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; SqlConnection(ConfigurationManager.ConnectionStrings[&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;ConnectionString&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;].ConnectionString);
  SqlCommand command1 &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; SqlCommand(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;SELECT CategoryID, CategoryName FROM Categories&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, conn);
  SqlDataAdapter adapter &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; SqlDataAdapter(command);
  DataTable dt &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; DataTable();
  adapter.Fill(dt);
  catRepeater.DataSource &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; dt;
  catRepeater.DataBind();
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;Но как же быть с собственно товарами? Очень просто - добавим вложенный &lt;em&gt;Repeater&lt;/em&gt;:
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:aaaf3fe1-195d-4e0a-8251-f0b769daaf5a&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre style=&quot;background-color: rgb(255, 255, 128); white-space: -moz-pre-wrap;&quot;&gt;&lt;div&gt;&lt;!--  Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/  --&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:Repeater &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt; ID&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;catRepeater&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
  &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;HeaderTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;HeaderTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
  &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ItemTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;%# DataBinder&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;.Eval(Container.DataItem, &quot;CategoryName&quot;)%&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:Repeater &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;itemRepeater&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt; datasource&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&#39;&amp;lt;%# &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;GetItemDS(DataBinder.Eval(Container.DataItem,&quot;CategoryID&quot;).ToString())%&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&#39;&amp;gt;
  &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ItemTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;%# DataBinder&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;.Eval(Container.DataItem, &quot;ItemName&quot;)&amp;lt;/ItemTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:Repeater&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ItemTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
  &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;FooterTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;FooterTemplate&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:Repeater&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;Как видно из листинга второй &lt;em&gt;Repeater&lt;/em&gt; самый обыкновенный за исключением параметра &lt;em&gt;DataSource. &lt;/em&gt;За счет него при каждой инициализации вложенный &lt;em&gt;Repeater&lt;/em&gt; получает новый DataSource относящийся к текущей категории(CategoryID). Это достигается выполнением метода &lt;em&gt;GetItemDS(string categoryID),&lt;/em&gt; возвращающим DataTable. В качестве &lt;em&gt;categoryID&lt;/em&gt; передается результат выполнения директивы привязки данных &lt;em&gt;DataBinder.Eval(Container.DataItem,&quot;CategoryID&quot;).ToString().&lt;/em&gt; Благодаря тому, что первым параметром методу &lt;em&gt;Eval&lt;/em&gt; передается Container.DataItem мы получаем CategoryID текущей категори. Вот его код метода &lt;em&gt;GetItemDS&lt;/em&gt;:
&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:9c889b78-c6b1-4f02-8778-1615ac1f0d60&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre style=&quot;background-color: rgb(255, 255, 128); white-space: -moz-pre-wrap;&quot;&gt;&lt;div&gt;&lt;!--  Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/  --&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;protected&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; DataTable GetItemDS(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; categoryID)
{
  SqlConnection conn &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; SqlConnection(ConfigurationManager.ConnectionStrings[&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;ConnectionString&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;].ConnectionString);
  SqlCommand command &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; SqlCommand(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;SELECT ItemName FROM Items WHERE CategoryID=@CategoryID&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, conn);
  command.Parameter.Add(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;@CategoryID&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, SqlDbType.Int).Value &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; categoryID;
  SqlDataAdapter adapter &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; SqlDataAdapter(command);
  DataTable dt &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; DataTable();
  adapter.Fill(dt);
  &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; dt;
}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;Вот собственно и все что нам требуется для достижения результата. Еще раз рассмотрим всю конструкцию. Первоначально мы имеем &lt;em&gt;Repeater &lt;/em&gt;который берет данные и выводит категории. В нем мы имеем вложенный &lt;em&gt;Repeater&lt;/em&gt; &lt;em&gt;DataSource&lt;/em&gt; которого задается динамически с помощью вспомогательного метода &lt;em&gt;GetItemDS&lt;/em&gt; и директивы привязки данных с помощью которой в метод передается &lt;em&gt;CategoryID&lt;/em&gt; текущей категории. На основании полученной &lt;em&gt;DataTable&lt;/em&gt; вложенный &lt;em&gt;Repeater&lt;/em&gt; отображает все продукты текущей категории.</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/8291478019899211690/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/8291478019899211690' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/8291478019899211690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/8291478019899211690'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2007/01/nested-repeater-repeater.html' title='Nested Repeater - Вложенныйе Repeater'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-8947295160626700221</id><published>2007-01-15T15:16:00.001+03:00</published><updated>2007-01-15T15:37:31.274+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="event validation"/><category scheme="http://www.blogger.com/atom/ns#" term="htmltextwriter"/><category scheme="http://www.blogger.com/atom/ns#" term="rendering"/><title type='text'>Рендеринг веб-контрола по запросу</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Иногда в веб-приложении бывает необходимо отослать код, сгенерированный веб-контролом на email пользователю. Чаще всего это встречается в системах со всяческими отчетами. Рассмотрим как это можно реализовать.  &lt;/p&gt;&lt;p&gt;Каждый веб-контрол имеет в себе метод , &lt;em&gt;RenderControl(HtmlTextWriter)&lt;/em&gt; который при вызове рендерит контрол и возвращает, как результат HtmlTextWriter. Программно это выглядит так:
&lt;/p&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:fd1f008e-971f-433b-9130-89f0b32e1657&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre style=&quot;background-color: rgb(255, 255, 128); white-space: -moz-pre-wrap;&quot;&gt;&lt;div&gt;&lt;!--  Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/  --&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;StringBuilder SB &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringBuilder();
StringWriter SW &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringWriter(SB);
HtmlTextWriter htmlTW &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; HtmlTextWriter(SW);
WebControlToRenderID.RenderControl(htmlTW);
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;Непосредственно к коду вы можете подобраться через метод &lt;em&gt;ToString() &lt;/em&gt;объекта HtmlTextWriter.
&lt;p&gt;Однако данный подход прекрасно работающий в ASP.NET 1.1 не подходит для ASP.NET 2.0, так как при выполнении вы получите исключение: &lt;i&gt;RegisterForEventValidation can only be called during Render();&lt;/i&gt;
&lt;/p&gt;&lt;p&gt;Это происходит потому, что в ASP.NET 2.0 появилась новая возможность - Event Validation. Сделана она для того, чтобы помочь избежать так называемых Injection атак.
&lt;/p&gt;&lt;p&gt;К примеру у вас на веб-форме имеется &lt;em&gt;DropDownList &lt;/em&gt;контрол:
&lt;/p&gt;&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:64e9292a-3eb0-4341-b827-1a9517afee67&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre style=&quot;background-color: rgb(255, 255, 128); white-space: -moz-pre-wrap;&quot;&gt;&lt;div&gt;&lt;!--  Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/  --&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:DropDownList &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;MyDropDownList&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:ListItem &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;1&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Item 1&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:ListItem&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:ListItem &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;2&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Item 2&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:ListItem&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:ListItem &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;3&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;Item 3&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:ListItem&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;asp:DropDownList&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;Если через &lt;em&gt;postback &lt;/em&gt;страница передает значение &lt;em&gt;4&lt;/em&gt;, то ASP.NET генерирует исключение, так как ожидает значения 1, 2 или 3. Это идеальное поведение в том случае, если вы действительно хотите получать только 1, 2 или 3, так как если пришло значение 4, это означает, что что-то пошло не так. Но, если вы, к примеру, на клиенте динамически добавляете элемент к полученому select-у, то вас такое поведение не устроит.
&lt;p&gt;В цикле жизни страницы контрол регистрирует себя на подобную проверку через класс &lt;em&gt;ClientScriptManager &lt;/em&gt;методом &lt;em&gt;RegisterForEventValidation. &lt;/em&gt;Этот метод может быть вызван только на этапе &lt;em&gt;Render,&lt;/em&gt; иначе он генерирует исключение. А так как скорее код для програмной генерации контрола вызывается до этого этапа, к примеру, в событии &lt;em&gt;Button1_Click,&lt;/em&gt; то вы гарантировано получаете исключение.
&lt;/p&gt;&lt;p&gt;Естественно, сказанное выше применимо только к контролам требующим &lt;em&gt;Event Validation.&lt;/em&gt; Вот их список:
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;HtmlAnchor
&lt;/li&gt;&lt;li&gt;HtmlButton
&lt;/li&gt;&lt;li&gt;HtmlInputButton
&lt;/li&gt;&lt;li&gt;HtmlInputCheckBox
&lt;/li&gt;&lt;li&gt;HtmlInputHidden
&lt;/li&gt;&lt;li&gt;HtmlInputImage
&lt;/li&gt;&lt;li&gt;HtmlInputText
&lt;/li&gt;&lt;li&gt;HtmlInputPassword
&lt;/li&gt;&lt;li&gt;HtmlInputRadioButton
&lt;/li&gt;&lt;li&gt;HtmlInputReset
&lt;/li&gt;&lt;li&gt;HtmlInputSubmit
&lt;/li&gt;&lt;li&gt;HtmlSelect
&lt;/li&gt;&lt;li&gt;HtmlTextArea
&lt;/li&gt;&lt;li&gt;BulletedList
&lt;/li&gt;&lt;li&gt;Button
&lt;/li&gt;&lt;li&gt;Calendar
&lt;/li&gt;&lt;li&gt;CheckBox
&lt;/li&gt;&lt;li&gt;Table
&lt;/li&gt;&lt;li&gt;ChildTable
&lt;/li&gt;&lt;li&gt;WizardChildTable
&lt;/li&gt;&lt;li&gt;DataControlButton
&lt;/li&gt;&lt;li&gt;ImageButton
&lt;/li&gt;&lt;li&gt;DataControlImageButton
&lt;/li&gt;&lt;li&gt;LinkButton
&lt;/li&gt;&lt;li&gt;DataControlLinkButton
&lt;/li&gt;&lt;li&gt;DataControlPagerLinkButton
&lt;/li&gt;&lt;li&gt;DataGridLinkButton
&lt;/li&gt;&lt;li&gt;DetailsView
&lt;/li&gt;&lt;li&gt;DropDownList
&lt;/li&gt;&lt;li&gt;FormView
&lt;/li&gt;&lt;li&gt;GridView
&lt;/li&gt;&lt;li&gt;HiddenField
&lt;/li&gt;&lt;li&gt;ImageMap
&lt;/li&gt;&lt;li&gt;LayoutTable
&lt;/li&gt;&lt;li&gt;ListBox
&lt;/li&gt;&lt;li&gt;Menu
&lt;/li&gt;&lt;li&gt;PagerTable
&lt;/li&gt;&lt;li&gt;RadioButton
&lt;/li&gt;&lt;li&gt;RadioButtonList
&lt;/li&gt;&lt;li&gt;TextBox
&lt;/li&gt;&lt;li&gt;TreeView
&lt;/li&gt;&lt;li&gt;WizardDefaultInnerTable
&lt;/li&gt;&lt;li&gt;CatalogZone
&lt;/li&gt;&lt;li&gt;ConnectionsZone
&lt;/li&gt;&lt;li&gt;EditorZone
&lt;/li&gt;&lt;li&gt;WebPartZone
&lt;/li&gt;&lt;li&gt;ZoneButton
&lt;/li&gt;&lt;li&gt;ZoneLinkButton&lt;/li&gt;&lt;/ol&gt;Чтобы исправить подобное поведение требуется одно легкое телодвижение. Необходимо вставить, на страницы, рендерящие контрол програмно такой параметр к директиве &lt;em&gt;@Page:&lt;/em&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: rgb(255, 255, 128); white-space: -moz-pre-wrap;&quot;&gt;&lt;div&gt;&lt;!--  Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/  --&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;% @Page &lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;EnableEventValidation&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;=&quot;False&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt; ... %&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;Или же вы можете начинать рендеринг контрола(ов) в событии &lt;em&gt;Page_Render.

&lt;span style=&quot;font-style: italic;&quot;&gt;Перевод статьи &lt;/span&gt;&lt;/em&gt;&lt;a href=&quot;http://aspnet.4guysfromrolla.com/articles/122006-1.aspx&quot;&gt;Emailing the Rendered Output of an ASP.NET Web Control in ASP.NET 2.0&lt;/a&gt;&lt;em&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;
&lt;/em&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/8947295160626700221/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/8947295160626700221' title='Комментарии: 17'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/8947295160626700221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/8947295160626700221'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2007/01/blog-post_15.html' title='Рендеринг веб-контрола по запросу'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-8116967849501893428</id><published>2007-01-15T10:17:00.001+03:00</published><updated>2007-01-15T13:30:56.436+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="urlrewriting"/><title type='text'>Url Rewriting в ASP.NET 2</title><content type='html'>&lt;p&gt;Намедни делая небольшой сайт для знакомой стало ясно что мне понадобится для него модная нынче штука - UrlRewriting. Представляя себе как это делается&amp;nbsp;в общих чертах я воодушевился и полез в Google.&lt;/p&gt; &lt;p&gt;Естественно, первое на что я наткнулся был встроенный в ASP.NET 2 UrlMapping, но почитав про него я понял, что его возможностей для меня будет мало. Сделав еще пару кликов мышью в SERP я набрел на замечательный модуль: &lt;a href=&quot;http://www.urlrewriting.net/en/Default.aspx&quot; target=&quot;_blank&quot;&gt;UrlRewritingNet.UrlRewrite&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Основными его плюсами можно считать:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;настройка через web.config&amp;nbsp;с использованием RegEx  &lt;li&gt;возможность добавления/изменения Rewrite правил на лету  &lt;li&gt;правильная работа с Themes, MasterPages, Postback, Cookieless Sessions  &lt;li&gt;необходимость доступа к IIS Manager только для Rewriting урлов без .aspx расширения&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Приведу небольшой пример использования, который покажет насколько просто использовать этот модуль. Допустим, у нас есть страница news.apsx, которая выдает новости таким видом: news.aspx?id=13, а мы хотим сделать урл вида news/13.aspx. Для этого добавьте этот код в web.config&amp;nbsp;в секцию &amp;lt;configuration&amp;gt;:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:ceca2e9b-1cca-4cfd-924d-a61087da6fca&quot; contenteditable=&quot;false&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;&lt;pre style=&quot;background-color:#FFFF80;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;configSections&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;
    &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;section &lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;urlrewritingnet&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; restartOnExternalChanges&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; requirePermission&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;configSections&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;urlrewritingnet &lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;http://www.urlrewriting.net/schemas/config/2006/07&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; rewriteOnlyVirtualUrls&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; contextItemsPrefix&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;QueryString&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; defaultProvider&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;RegEx&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;
    &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;rewrites&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;
      &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;add &lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;News&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; virtualUrl&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;~/news/(.*).aspx&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt;            rewriteUrlParameter&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;ExcludeFromClientQueryString&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; destinationUrl&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;~/news.aspx?id=$1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; ignoreCase&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt; 
    &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;rewrites&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt; 
&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;urlrewritingnet&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Как видно из данного примера правило Rewrite задается простейшим RegEx выражением. В то же время RegEx дает потенциальную мощность и вы сможете создавать более сложные правила. К примеру такую /news/2007/01/15/url-rewriting.aspx ссылку вы сможете обрабатывать с помщью этого правила:&lt;/p&gt;
&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ceeb5fad-4f85-4905-b60f-43e0f3a0542f&quot; contenteditable=&quot;false&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;&lt;pre style=&quot;background-color:#FFFF80;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;rewrites&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;
      &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;add &lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;News&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; virtualUrl&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;~/news/(.*)/(.*)/(.*)/(.*).aspx&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt;            rewriteUrlParameter&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;ExcludeFromClientQueryString&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; destinationUrl&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;~/news.aspx?alias=$4&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; ignoreCase&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF0000; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt; 
    &lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;rewrites&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt; &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/8116967849501893428/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/8116967849501893428' title='Комментарии: 16'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/8116967849501893428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/8116967849501893428'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2007/01/url-rewriting-aspnet-2.html' title='Url Rewriting в ASP.NET 2'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2771203200371710927.post-2490616691244271869</id><published>2007-01-15T02:14:00.000+03:00</published><updated>2007-01-15T02:35:51.794+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="asp.net"/><category scheme="http://www.blogger.com/atom/ns#" term="blog"/><category scheme="http://www.blogger.com/atom/ns#" term="sql server 2005"/><title type='text'>Добро!</title><content type='html'>Ну что ж начнем. Первый пост комом, как говорится, но все же. Как видно из названия блога - посвящен он будет веб-программированию, а именно ASP.NET 2.0 и все, что с ним связано - Sql Server 2005, AJAX, SEO and more. Так же, если меня сильно заденут, здесь будут пробегать общие новости, вроде выхода iPhone(смайл). Этот блог - моя первая попытка создать нечто не лытдыбровское, а посвященное чему-то доброму, вечному и полезному, так что особо не пинайте. На этом вступление считаю оконченным. Буду рад, если этот блог будет кому-либо полезным.</content><link rel='replies' type='application/atom+xml' href='http://netartdev.blogspot.com/feeds/2490616691244271869/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2771203200371710927/2490616691244271869' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/2490616691244271869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2771203200371710927/posts/default/2490616691244271869'/><link rel='alternate' type='text/html' href='http://netartdev.blogspot.com/2007/01/blog-post.html' title='Добро!'/><author><name>SynteZZZ</name><uri>http://www.blogger.com/profile/13269913758366955900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv9QGIjPoEPzV8P6UQi3deh1EgA_AZ0A1D0D-HKT7NgM2tkhs_Q38-9_t2zTAESePM9D8EJUO1nd5fb4n-R1KnbhrwJwSmiayQIh5aWmB5jaiVVVXfHddjLp-UsPd29Hs/s220/_MG_0337.JPG'/></author><thr:total>1</thr:total></entry></feed>