<?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-2431668099949260719</id><updated>2026-01-24T02:09:37.077+03:00</updated><category term="C#"/><category term=".Net"/><category term="SharePoint"/><category term="ASP.NET"/><category term="SQL"/><category term="Windows Forms"/><category term="мысли вслух"/><category term="Entity Framework"/><category term="jQuery"/><category term="Франция"/><category term="интересно"/><category term="полезное"/><category term="путешествия"/><category term="юмор"/><category term="ASP.NET MVC"/><category term="WCF"/><category term="css"/><category term="web"/><category term="для новичков"/><category term="настройка"/><category term="IIS"/><category term="JavaScript"/><category term="LINQ"/><category term="Team Foundation Server"/><category term="Visual Studio"/><category term="bat-файлы"/><category term="авиа"/><category term="безопасность"/><category term="впечатления"/><category term="отладка"/><category term="распродажи"/><category term="события"/><category term="совместимость"/><category term="фото"/><title type='text'>.NetBlog - блог о программировании на C# .Net, и других, не мене интересных вещах.</title><subtitle type='html'>Заметки о разработке ПО, советы по .net, SharePoint, SQL, архитектура приложений, литература по программированию. А также просто просто мысли о жизни и рассказы о том, что интересно автору, например путешествиях и вкусной еде ;)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>82</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-1088912352408698101</id><published>2015-09-30T15:51:00.001+03:00</published><updated>2015-09-30T15:51:38.908+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Про using или знаете ли вы что...</title><content type='html'>Наверняка, вы знаете что в C# есть такая конструкция, как using. И, скорее всего, в курсе, что использовать его можно и нужно только с объектами, реализующими интерфейс IDisposable (и, соответственно, скорее всего, что-то делающими с неуправляемыми ресурсами). На всякий случай, напомню, что конструкция вида:&lt;br&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt; 
using (someType obj = new someType())
{
         //тут что-то происходит
}
&lt;/pre&gt;
разворачивается компилятором вот в такую:&lt;br&gt;
&lt;br&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt; 
someType obj = new someType();
try
{
        //тут что-то происходит
}
finally
{
        //если объект значимого типа (value-type)
        ((IDisposable)obj).Dispose();

        //или, если объект ссылочного типа (reference-type)
        if (obj!=null)
           ((IDisposable)obj).Dispose();
}
&lt;/pre&gt;
а где же блок catch, спросите вы? Почему его нет? И почему не предусмотрен вариант using, где его можно задать?
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2015/09/using.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/1088912352408698101/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2015/09/using.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/1088912352408698101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/1088912352408698101'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2015/09/using.html' title='Про using или знаете ли вы что...'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-4679390918315667765</id><published>2015-03-25T20:47:00.002+03:00</published><updated>2015-03-25T20:48:01.789+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Как в .Net получить действительно случайные числа</title><content type='html'>Наверняка, всем известно о существовании в .Net класса System.Random, позволяющего получать якобы случайные числа практически без особых как умственных, так и временных затрат. Представьте что у нас есть такой вот метод, который чисто ради эксперимента мы вызовем в цикле несколько раз:&lt;br&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;        
        static string GetRandomNum(int minValue, int maxValue)
        {
            Random rnd = new Random();
            return rnd.Next(minValue, maxValue).ToString();
        }

        for (int i = 0; i &amp;lt; 10; i++)
        {
            Console.WriteLine(GetRandomNum(1,11));
        }
&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
В данном случае вы получите совершенно одинаковые все &amp;quot;случайные&amp;quot; цифры.&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIiupo2x9Yv2KqCz7bPBfk8EhbJDoUrKaj_m3dNmFB2PFQ9R7vlygcj4CSL2Rc0b6lcbLR9NRAHYDxQ_PzjGAZCc48QLDmlu5JM_KG0p_q60fHzoGH0Ho7602_4to7VCfJKtqCZsmUrcq1/s1600/rnd.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIiupo2x9Yv2KqCz7bPBfk8EhbJDoUrKaj_m3dNmFB2PFQ9R7vlygcj4CSL2Rc0b6lcbLR9NRAHYDxQ_PzjGAZCc48QLDmlu5JM_KG0p_q60fHzoGH0Ho7602_4to7VCfJKtqCZsmUrcq1/s1600/rnd.jpg&quot; height=&quot;166&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
Происходит так потому, что при инициализации объекта Random с использованием конструктора по умолчанию в качестве числа, использующегося для вычисления случайных чисел используется Environment.TickCount (количество миллисекунд, прошедших со времени старта системы), который обновляется раз в 15.6 миллисекунд. &lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2015/03/net.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/4679390918315667765/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2015/03/net.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/4679390918315667765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/4679390918315667765'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2015/03/net.html' title='Как в .Net получить действительно случайные числа'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIiupo2x9Yv2KqCz7bPBfk8EhbJDoUrKaj_m3dNmFB2PFQ9R7vlygcj4CSL2Rc0b6lcbLR9NRAHYDxQ_PzjGAZCc48QLDmlu5JM_KG0p_q60fHzoGH0Ho7602_4to7VCfJKtqCZsmUrcq1/s72-c/rnd.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-150665553376127750</id><published>2015-03-12T13:26:00.001+03:00</published><updated>2015-03-12T13:26:56.899+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Используем сессию в обработчиках (HTTP handlers) ASP.NET</title><content type='html'>Представьте себе гипотетическую ситуацию, когда вам нужно отдавать пользователю файлы, с, допустим, какими-то индивидуальными для каждого пользователя данными, причем именно отдавать уже готовые файлы, а не генерировать на лету. Самым простым и очевидным вариантом было бы создать обработчик, который будет вызываться для запросов вида &amp;quot;*_report.pdf&amp;quot;, но для этого нам нужно понимать, можно ли отдавать пользователю файл, который он запрашивает или он принадлежит другому пользователю.&lt;br&gt;
Передавать идентификатор в явном виде не только не правильно идеологически, но и просто не красиво, да и сохраненный файл, полученный по ссылке вида &lt;b&gt;10102_u323467_report.pdf?sessId=05446DA8F736B29A&lt;/b&gt; будет по умолчанию сохранен с таким же &amp;quot;кривым&amp;quot; именем.&lt;br&gt;
&lt;br&gt;
Значительно проще положить этот идентификатор в сессию и получать его в обработчике уже оттуда. Для того, чтобы объект Session был доступен, нам нужно, чтобы обработчик наследовал не только от интерфейса IHttpHandler, но од одного из интерфейсов IRequiresSessionState или IReadOnlySessionState в зависимости от того нужен ли нам доступ только на чтение (IReadOnlySessionState) или на чтение и запись (IRequiresSessionState). На самом деле, записать в объект сессии вы сможете что угодно в любом случае, единственное отличие, что при использовании IReadOnlySessionState в конце обработки запроса данные сессии не сохраняются.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2015/03/http-handlers-aspnet.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/150665553376127750/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2015/03/http-handlers-aspnet.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/150665553376127750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/150665553376127750'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2015/03/http-handlers-aspnet.html' title='Используем сессию в обработчиках (HTTP handlers) ASP.NET'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-7012347346068735911</id><published>2015-03-11T17:27:00.003+03:00</published><updated>2015-03-11T19:10:23.198+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Как сделать поля ввода с &quot;подсказками&quot; с помощью jQuery и CSS</title><content type='html'>Иногда мало сделать просто красивый дизайн странички, а хочется еще дать пользователю какие-то подсказки по заполнению полей. Самый простой и наиболее очевидный способ - создать поля с подсказками в виде &amp;quot;текста по умолчанию&amp;quot;, примерно вот такие:&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga3CWagppebaQmPIdBWX6qfka1CGYCkwo9HHG3BiVIhfSVHIfx3Toiy_xQ53_qfvnmm4Oy3-R8sucLIqdwvPQ_JCggaqzFLRT8mmRZNJctGV8YDUUJrw9zDXYN5ZWfRe3zuScL-mD_z8X-/s1600/mocjup.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga3CWagppebaQmPIdBWX6qfka1CGYCkwo9HHG3BiVIhfSVHIfx3Toiy_xQ53_qfvnmm4Oy3-R8sucLIqdwvPQ_JCggaqzFLRT8mmRZNJctGV8YDUUJrw9zDXYN5ZWfRe3zuScL-mD_z8X-/s1600/mocjup.jpg&quot; height=&quot;66&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
В принципе, все современные браузеры, поддерживают стандарт HTML5 и, соответственно, атрибут &lt;b&gt;placeholder&lt;/b&gt;, которой для этой цели и был придуман. Проблема в том, если вам необходима поддержка старых браузеры или чуть менее старые версии Internet Explorer (который начал поддерживать этот атрибут только в 10 версии), то подсказку созданную с помощью него они не увидят.&lt;br&gt;
Если вы используете на своем сайте jQuery, то есть простое и быстрое решение для создания таких полей буквально несколькими строчками кода.  Прежде всего нужно создать стиль отображения &amp;quot;подсказок&amp;quot;:&lt;br&gt;
&lt;br&gt;
&lt;pre class=&quot;brush:css&quot;&gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
    .helpField { background:white; }
    .blankHelpFieldText { color: #a1a1a1; font-style: italic; }
&amp;lt;/style&amp;gt;
&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
При этом, первый стиль несет в себе единственное практическое предназначение - быть &amp;quot;свойством&amp;quot; к которому будет привязываться скрипт отображения текста подсказки. Так что, вместо background можете написать что вам больше подходит, например width.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2015/03/jquey-css.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/7012347346068735911/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2015/03/jquey-css.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7012347346068735911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7012347346068735911'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2015/03/jquey-css.html' title='Как сделать поля ввода с &quot;подсказками&quot; с помощью jQuery и CSS'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga3CWagppebaQmPIdBWX6qfka1CGYCkwo9HHG3BiVIhfSVHIfx3Toiy_xQ53_qfvnmm4Oy3-R8sucLIqdwvPQ_JCggaqzFLRT8mmRZNJctGV8YDUUJrw9zDXYN5ZWfRe3zuScL-mD_z8X-/s72-c/mocjup.jpg" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-6522324559615635814</id><published>2015-02-05T13:54:00.000+03:00</published><updated>2015-02-05T13:54:53.815+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint"/><category scheme="http://www.blogger.com/atom/ns#" term="настройка"/><title type='text'>Как победить ошибку &quot;The SDDL string contains an invalid sid...&quot; при установке SharePoint 2013</title><content type='html'>Я уже два раза при установке SharePoint Server 2013 сталкивался c возникновение странной ошибки &amp;quot;The SDDL string contains an invalid sid or a sid that cannot be translated&amp;quot; или &amp;quot;Строка SDDL содержит недопустимый sid либо sid, который не может быть преобразован.&amp;quot; для русскоязычной версии. Выглядит момент появления ошибки вот так:&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFh5sVo59bcfuM9N6kkQwrJL4SUG71CgPmhXzk6zFSwP0kkSjGV_tpEY0XQSWdedyiAblKB4wKHdoOOeqapeThDp_ApmUxtcMTfUYCy2Hv5CzRtEb7ytkhE0yOZ2t6CzEMcv6kObT2xvoX/s1600/sharepoint_error.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFh5sVo59bcfuM9N6kkQwrJL4SUG71CgPmhXzk6zFSwP0kkSjGV_tpEY0XQSWdedyiAblKB4wKHdoOOeqapeThDp_ApmUxtcMTfUYCy2Hv5CzRtEb7ytkhE0yOZ2t6CzEMcv6kObT2xvoX/s1600/sharepoint_error.jpg&quot; height=&quot;448&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
Как это часто периодически бывает с продуктами Microsoft текст ошибки никак не намекает ни то что на решение проблемы, но даже на то в какую сторону надо смотреть. &lt;/div&gt;&lt;a href=&quot;http://www.dotnetblog.ru/2015/02/sddl-string-contains-invalid-sid.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/6522324559615635814/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2015/02/sddl-string-contains-invalid-sid.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/6522324559615635814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/6522324559615635814'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2015/02/sddl-string-contains-invalid-sid.html' title='Как победить ошибку &quot;The SDDL string contains an invalid sid...&quot; при установке SharePoint 2013'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFh5sVo59bcfuM9N6kkQwrJL4SUG71CgPmhXzk6zFSwP0kkSjGV_tpEY0XQSWdedyiAblKB4wKHdoOOeqapeThDp_ApmUxtcMTfUYCy2Hv5CzRtEb7ytkhE0yOZ2t6CzEMcv6kObT2xvoX/s72-c/sharepoint_error.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-7328316408847498614</id><published>2015-01-11T12:08:00.000+03:00</published><updated>2015-02-03T08:01:02.969+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Делаем локализацию сайта на ASP.NET MVC</title><content type='html'>Представьте, что вы решили делать сайт с использованием ASP.NET MVC. И, помимо всего прочего, вам на этом сайте вам нужна возможность отображения его на нескольких языках. Задача, хоть и кажущаяся с первого взгляда не самой тривиальной, на самом деле, достаточно проста. И я сейчас расскажу что для этого нужно сделать.&lt;br&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
Во-первых, необходимо как-то передавать идентификатор языка. Можно, конечно, придумать какое-нибудь извращение, типа хранения текущего языка в сессии, но лучше всего просто передавать его в URL. Как минимум, в это случае, локализованными ссылками на ваш сайт можно будет без проблем делиться, хоть в соцсеятх, хоть пересылать их по e-mail. &lt;/div&gt;
&lt;div&gt;
Для этого в вашем проекте открываем файл &lt;b&gt;RouteConfig.cs&lt;/b&gt;, находящийся в папке &lt;b&gt;App_Start&lt;/b&gt; и добавляем туда путь для локализованного  контента.&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute(&amp;quot;{resource}.axd/{*pathInfo}&amp;quot;);

            routes.MapRoute(
                name: &amp;quot;Localization&amp;quot;,
                url: &amp;quot;{lang}/{controller}/{action}/{id}&amp;quot;,
                defaults: new { lang = &amp;quot;ru&amp;quot;, controller = &amp;quot;Home&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional },
                //ограничение необходимо, чтобы отличить параметр языка от параметра контроллера. 
                //В данном случае, в качестве параметра lang подходят все двухсимвольные комбинации из букв латинского алфавита, например &amp;quot;en&amp;quot; или &amp;quot;fr&amp;quot;
                constraints: new { lang = @&amp;quot;[a-z]{2}&amp;quot; }
            );

            routes.MapRoute(
                name: &amp;quot;Default&amp;quot;,
                url: &amp;quot;{controller}/{action}/{id}&amp;quot;,
                defaults: new { controller = &amp;quot;Home&amp;quot;, action = &amp;quot;Index&amp;quot;, id = UrlParameter.Optional }           
            );
        }
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
Теперь, если в URL содержится идентификатор языка, то он будет приходить нам в коллекции RequestContext.RouteData, и получить его проще всего в методе в методе Initialize контроллера. Давайте для простоты сделаем локализованную страничку авторизации, которая будет отображаться сразу же при входе на сайт, то есть по пути /.&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;&lt;a href=&quot;http://www.dotnetblog.ru/2015/01/aspnet-mvc.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/7328316408847498614/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2015/01/aspnet-mvc.html#comment-form' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7328316408847498614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7328316408847498614'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2015/01/aspnet-mvc.html' title='Делаем локализацию сайта на ASP.NET MVC'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKS3MQEpFUTylwhHqcCd3qhqlTn0HXFu5h1TgHz10tJ4Hgbfs-J5YXUAkwUvnNnUBQOqmrq45tHhrOUFKGgYsPbroYySnoefpAdNQwsOAe_Qqm3nZPYN7AcfKe2csWeyp7o6ujJp1M-4xl/s72-c/db.jpg" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-7523081666677139257</id><published>2014-12-15T13:06:00.001+03:00</published><updated>2014-12-15T13:13:16.498+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="для новичков"/><title type='text'>О передаче параметров в C#</title><content type='html'>Давайте сразу начнем с кода. У нас есть вот такой код, давайте разберемся почему он выводит то, что выводит:&lt;br&gt;
&lt;br&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt; 
    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            ProcessValue(a);
            Console.WriteLine(a.ToString());
            //здесь будет выведено 1

            TestClass test = new TestClass();
            test.val = 2;
            ProcessRef(test);
            Console.WriteLine(test.val.ToString());
            //здесь будет выведено 10

            TestClass test = new TestClass();
            test.val = 3;
            Process(test);
            Console.WriteLine(test.val.ToString());
            //а здесь будет выведено 3
        }

        static void ProcessValue(int par)
        {
            par = 3;
        }

        static void ProcessRef(TestClass par)
        {
            par.val = 10;
        }

        static void Process(TestClass par)
        {
            par = new TestClass();
            par.val = 100;
        }
    }
 

    public class TestClass
    {
        public int val;
    }

&lt;/pre&gt;
&lt;br&gt;
Вы, наверняка, знаете, что в .Net есть значимые (value) и ссылочные (reference) типы. Первые - размещаются полностью в стеке, а вторые размещаются в управляемой куче, а в стеке размещается только указатель на них.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/12/c.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/7523081666677139257/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/12/c.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7523081666677139257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7523081666677139257'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/12/c.html' title='О передаче параметров в C#'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgINBawtUFdbOF3SbIWw7P14b-G5TDlaVyA6H6El7zcfX4zqOfaM0U79IHZGZXwq34dYRayU8He7jBW0SIzB2N2eK2sLSDha-Lxo8joqfVTe7suG-D2tCdu0tAi59BBPRkIpMk0OBPs_FK4/s72-c/valref.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-1257987107669464983</id><published>2014-12-07T10:17:00.000+03:00</published><updated>2014-12-07T10:24:30.553+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="WCF"/><title type='text'>Обработка исключений при работе с WCF-сервисами</title><content type='html'>Наверняка вы сталкивались с ситуацией, когда в случае ошибки в WCF-сервисе нужно передать клиенту какие-либо данные либо, например, подробное описание что случилось. Очень часто встречаются реализации WCF- сервисов, использующие возвращаемые клиенту объекты с дополнительными, используемыми только в случае ошибки, полями, даже если реализация метода не требует возврата какого-либо результата клиенту. Так делают потому, что если просто выбросить исключение, то клиент не получит практически никакой информации о том, что случилось. Представьте, что у нас есть WCF сервис вот с таким простым контрактом и реализацией.&lt;br&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;  
    //контракт
    [ServiceContract]
    public interface IDataService
    {        
        [OperationContract]        
        void TestError();
    }

    //реализация
    public void TestError()
    {
       throw new Exception(&amp;quot;Error!&amp;quot;);
    }

&lt;/pre&gt;
&lt;br&gt;
&lt;div&gt;
В если реализовать сервис именно так, то на клиент придет исключение, которое не дает никаких сведений о случившемся:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzEsm7-YSRqg0kjJkj-dxiFfjVCKCDQ7pQ3txKe1154uQ__w_7BoLTAzLMsGwEhNWahMAFaHoMelUG4EcV7KT1X3SvCIah1anQjRQcEqeL-L79Ed_AQR8mrgO9V9aEr_AKV9jPyEuJrHBn/s1600/error_message.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzEsm7-YSRqg0kjJkj-dxiFfjVCKCDQ7pQ3txKe1154uQ__w_7BoLTAzLMsGwEhNWahMAFaHoMelUG4EcV7KT1X3SvCIah1anQjRQcEqeL-L79Ed_AQR8mrgO9V9aEr_AKV9jPyEuJrHBn/s1600/error_message.jpg&quot; height=&quot;120&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
Можно, конечно, как написано в ошибке, включить IncludeExceptionDetailInFaults, как написано в сообщении об ошибке. Но это свойство не рекомендуется использовать кроме как для отладки, так как при этом любой клиент в случае ошибки получить все данные о стеке вызовов и структуре вашего сервиса, что очень нехорошо с точки зрения безопасности.&lt;br&gt;
Но, помимо варианта для отладки и архитектурно не самого лучшего варианта с дополнительным полем в результате вызова, есть и третий вариант - более удобный и более правильный.&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;&lt;a href=&quot;http://www.dotnetblog.ru/2014/12/wcf.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/1257987107669464983/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/12/wcf.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/1257987107669464983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/1257987107669464983'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/12/wcf.html' title='Обработка исключений при работе с WCF-сервисами'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzEsm7-YSRqg0kjJkj-dxiFfjVCKCDQ7pQ3txKe1154uQ__w_7BoLTAzLMsGwEhNWahMAFaHoMelUG4EcV7KT1X3SvCIah1anQjRQcEqeL-L79Ed_AQR8mrgO9V9aEr_AKV9jPyEuJrHBn/s72-c/error_message.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-4416465740886813519</id><published>2014-12-06T10:06:00.005+03:00</published><updated>2015-01-19T22:50:20.401+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="мысли вслух"/><title type='text'>Несколько мыслей о получении IP адреса клиента в ASP.NET</title><content type='html'>Получение IP-адреса клиента - это, наверное, один из самых интересных и неоднозначных вопросов не только в ASP.NET, но и вообще в веб-разработке. Вариантов, как это сделать несколько, и у каждого из способов есть как сторонники, так и противники. Попробую рассказать вам об этих вариантах, чем они отличаются друг от друга и что лучше использовать.&lt;br&gt;
&lt;br&gt;
Итак, самый широко известный в мире ASP.NET способ получения IP-адреса клиента - это использование &lt;b&gt;HttpContext.Current.Request.UserHostAddress&lt;/b&gt;, который, по сути является оберткой над HTTP заголовком REMOTE_ADDR, в которую записывается адрес хоста от которого серверу пришел запрос. А этот заголовок используется практически во всех языках программирования, для целей определения IP клиента. И везде не утихают споры правильно ли использовать именно его. Почему? Потому, что REMOTE_ADDR содержит адрес компьютера, установившего соединение с сервером. Во времена становления интернет и появления протокола HTTP этик компьютером почти наверняка являлся клиент, так что все было хорошо. Сейчас же, в большинстве случаев, в REMOTE_ADDR будет адрес прокси сервера внутренней сети (корпоративной, или домашней - смысла это не меняет) через который прошел запрос клиента.&lt;br&gt;
И еще один пример, с которым, особенно часто сталкиваются Linux программисты, в результате криво настроенного nginx. ;)&lt;br&gt;
Представьте себе ситуацию, что у вас есть криво настроенный балансировщик нагрузки. В таком случае в REMOTE_ADDR будет 10.10.0.2, что, естественно совершенно не клиентский адрес.&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuBbgUH2-p2xeInL8llDFM0z4mjQevak27Kij-XytBYLEGbyQxQnLMapfGdrPUpc_uvcqNn5lCLvaNCBkgb3YApdRZo9UAgncf3WFOdaHCceXZV0jF56EvVDvCQ2UxziVBO_QDQZ02Gz5T/s1600/server.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuBbgUH2-p2xeInL8llDFM0z4mjQevak27Kij-XytBYLEGbyQxQnLMapfGdrPUpc_uvcqNn5lCLvaNCBkgb3YApdRZo9UAgncf3WFOdaHCceXZV0jF56EvVDvCQ2UxziVBO_QDQZ02Gz5T/s1600/server.jpg&quot; height=&quot;160&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/12/ip-aspnet.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/4416465740886813519/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/12/ip-aspnet.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/4416465740886813519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/4416465740886813519'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/12/ip-aspnet.html' title='Несколько мыслей о получении IP адреса клиента в ASP.NET'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuBbgUH2-p2xeInL8llDFM0z4mjQevak27Kij-XytBYLEGbyQxQnLMapfGdrPUpc_uvcqNn5lCLvaNCBkgb3YApdRZo9UAgncf3WFOdaHCceXZV0jF56EvVDvCQ2UxziVBO_QDQZ02Gz5T/s72-c/server.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-782992005265060003</id><published>2014-11-27T13:37:00.006+03:00</published><updated>2014-11-27T13:46:07.312+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="WCF"/><category scheme="http://www.blogger.com/atom/ns#" term="полезное"/><title type='text'>Как получить IP-адрес клиента в WCF-сервисе.</title><content type='html'>Если вам нужно узнать с какого адреса приходит обращение к вашему WCF-сервису, то сделать это вы можете несколькими способами в зависимости от версии .Net Framework. Давайте по порядку.&lt;br&gt;
В версии 3.0 (то есть, самая первая версия .Net, в которой стала доступна WCF) по заверениям Microsoft не существует гарантированного способа это сделать.  В принципе, если сервис хостится на IIS, то можно попробовать пару извращений, типа получения IP-адреса клиента из логов сервера (хотя встает вопрос как определять какая из записей лога соответствует текущему запросу). В общем, предлагаю придерживаться позиции Microsoft по этому вопросу ;)&lt;br&gt;
В версии .Net 3.5 в WCF появляется класс  &lt;b&gt;System.ServiceModel.OperationContext&lt;/b&gt;, так что подключаем сборку  System.ServiceModel и используем вот такой код, который и вернет на IP клиента:&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/11/ip-wcf.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/782992005265060003/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/11/ip-wcf.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/782992005265060003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/782992005265060003'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/11/ip-wcf.html' title='Как получить IP-адрес клиента в WCF-сервисе.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-5728795606777910306</id><published>2014-11-23T21:26:00.002+03:00</published><updated>2014-11-23T21:26:34.519+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="IIS"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="отладка"/><title type='text'>Отладка 64-битных веб-приложений в Visual Studio</title><content type='html'>Представьте себе ситуацию, то вы разрабатываете веб-приложение, которое либо просто само по себе 64-битное (x64), либо еще и использует какие-либо x64 библиотеки. При попытке запуска отладки такого приложения вы получите сообщение об ошибке из серии BadImageFormatException.&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGFcUAWM7DtQRnrp5F2Hop6cTa-YySomR8wd-xZEYs77JVJLVOVyLDTcG_twBg2G4f2n8usPNIXfF3GHb1nX7gq32apeZYACJGExRSyqS3SeU7jDunukgrxDC1Kd-EE-_N3LepKJVEwPfg/s1600/web_error.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGFcUAWM7DtQRnrp5F2Hop6cTa-YySomR8wd-xZEYs77JVJLVOVyLDTcG_twBg2G4f2n8usPNIXfF3GHb1nX7gq32apeZYACJGExRSyqS3SeU7jDunukgrxDC1Kd-EE-_N3LepKJVEwPfg/s1600/web_error.jpg&quot; height=&quot;84&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
А происходит такое по тому, что IIS Express, используемый в Visual Studio для отладки, работает как 32-битный процесс, в чем легко убедится, взглянув в Task Manager:&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifSW1i537ztL6RfMyajfZMOymHVS3e_DacKSkdlYusS5ePjz0Aq5L-tKvnpEkiKXGwYaS9MH0h8SRFiBgY8kdSYm_DdnUXrgnpLTZikhYhjtdxjK-AeuxXAnaDB9e1ceTk1Y40yiZX6TN5/s1600/32bit_iis.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifSW1i537ztL6RfMyajfZMOymHVS3e_DacKSkdlYusS5ePjz0Aq5L-tKvnpEkiKXGwYaS9MH0h8SRFiBgY8kdSYm_DdnUXrgnpLTZikhYhjtdxjK-AeuxXAnaDB9e1ceTk1Y40yiZX6TN5/s1600/32bit_iis.jpg&quot; height=&quot;170&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
И если при использовании версии Vsual Studio до 2012 единственным способом было использование для отладки локального &amp;quot;большого&amp;quot; IIS, соответствующим образом настроив свойства проекта:&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/11/64-visual-studio.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/5728795606777910306/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/11/64-visual-studio.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/5728795606777910306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/5728795606777910306'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/11/64-visual-studio.html' title='Отладка 64-битных веб-приложений в Visual Studio'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGFcUAWM7DtQRnrp5F2Hop6cTa-YySomR8wd-xZEYs77JVJLVOVyLDTcG_twBg2G4f2n8usPNIXfF3GHb1nX7gq32apeZYACJGExRSyqS3SeU7jDunukgrxDC1Kd-EE-_N3LepKJVEwPfg/s72-c/web_error.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-1404071179507186151</id><published>2014-11-22T11:29:00.001+03:00</published><updated>2014-11-22T11:29:05.646+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="настройка"/><title type='text'>Ошибки 0x800F081F и 0x800F0906 при установке .Net Framework 3.5 на Windows 8/8.1</title><content type='html'>По умолчанию .Net Framework 3.5 в Windows 8 и 8.1 не устанавливается, так что, во-первых, он не будет доступен в Visual Studio, а во-вторых, при попытке запустить что-то, что использует .Net 3.5 (например Windows 7 SDK) вы увидите примерно такое предложение:&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhveIBajVx9WqlZWLr4dnIKhQZIfiyOjjixzOttHgcKtQH6xo15Ka7Isw8IObAAaszbXFTeKyJAlc4KShV4yw06yy2yx5h9IUqlcUa3e3r2eBwtKXPIvRgk3gdg7O4ABHqHJoT_NXpLZav9/s1600/IC606071.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhveIBajVx9WqlZWLr4dnIKhQZIfiyOjjixzOttHgcKtQH6xo15Ka7Isw8IObAAaszbXFTeKyJAlc4KShV4yw06yy2yx5h9IUqlcUa3e3r2eBwtKXPIvRgk3gdg7O4ABHqHJoT_NXpLZav9/s1600/IC606071.png&quot; height=&quot;266&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
Не проблема, наверняка подумаете вы, и нажмете &amp;quot;Установить&amp;quot;.  В большинстве случае это, к сожалению, ни к чему хорошему не приведет и вы получите ошибку&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKB4baIDIScOZEfs7oou52tJII5_zA1bvmYv55o2Y8SYL9jcktCFDORHDLOA5NCJfHeLZJlSZshmSSXLsCiu2HptxbbthSPy9D4YgI-PpbTHbpz3eP5-z5bApko7xhHBqpz9ia_1U8pMhF/s1600/20141118_122335.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKB4baIDIScOZEfs7oou52tJII5_zA1bvmYv55o2Y8SYL9jcktCFDORHDLOA5NCJfHeLZJlSZshmSSXLsCiu2HptxbbthSPy9D4YgI-PpbTHbpz3eP5-z5bApko7xhHBqpz9ia_1U8pMhF/s1600/20141118_122335.jpg&quot; height=&quot;326&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
В английском варианте Windows ошибка звучит так:&lt;br&gt;
0x800F0906  The source files could not be downloaded.&lt;br&gt;
Windows couldn&amp;#39;t connect to the Internet to download necessary files. Make sure that you&amp;#39;re connected to the Internet and click &amp;quot;Retry&amp;quot; to try again.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/11/0x800f081f-0x800f0906-net-framework-35.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/1404071179507186151/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/11/0x800f081f-0x800f0906-net-framework-35.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/1404071179507186151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/1404071179507186151'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/11/0x800f081f-0x800f0906-net-framework-35.html' title='Ошибки 0x800F081F и 0x800F0906 при установке .Net Framework 3.5 на Windows 8/8.1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhveIBajVx9WqlZWLr4dnIKhQZIfiyOjjixzOttHgcKtQH6xo15Ka7Isw8IObAAaszbXFTeKyJAlc4KShV4yw06yy2yx5h9IUqlcUa3e3r2eBwtKXPIvRgk3gdg7O4ABHqHJoT_NXpLZav9/s72-c/IC606071.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-684506193819754955</id><published>2014-11-15T20:55:00.000+03:00</published><updated>2014-11-15T20:55:00.519+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bat-файлы"/><title type='text'>Помещение текущей даты в переменную в .bat-файле.</title><content type='html'>Недавно столкнулся с задачей, требующей ежедневного архивирования содержимого папки в архив вида &amp;quot;название файлаDD_MM_YYYY&amp;quot;. Чтобы это сделать в одном батнике надо выполнить несколько действий:&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
1. Понять как выводится дата в вашей локали. Для этого запускаем &lt;b&gt;CMD&lt;/b&gt; и пишем &lt;b&gt;DATE/T&lt;/b&gt;. Русская локаль -самая простая, в ней текущая дата выводится в виде 15.11.2014. В Английской, например, все несколько сложнее, там перед датой идет сокращенное название дня недели, например Sat 15.11.2014. На на данном этапе интересует та часть строки, которая содержит дату. Чтобы получить ее, на нужна сделать так:&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;for /f %%i in (&amp;#39;DATE/T&amp;#39;) do set date=%%i &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
или, если перед датой что-то находится, например Sat&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
f&lt;b&gt;or /f &amp;quot;tokens=2&amp;quot; %%i in (&amp;#39;DATE/T&amp;#39;) do set date=%%i&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
2. Теперь нам нужно заменить точки или слеши в дате на подчеркивание.&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;&lt;a href=&quot;http://www.dotnetblog.ru/2014/11/bat.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/684506193819754955/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/11/bat.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/684506193819754955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/684506193819754955'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/11/bat.html' title='Помещение текущей даты в переменную в .bat-файле.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-6259669654423968948</id><published>2014-11-13T10:05:00.001+03:00</published><updated>2014-11-13T10:05:16.751+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="интересно"/><title type='text'>Microsoft открыла исходные коды .Net Core</title><content type='html'>Сегодня Microsoft открыла исходный код основных компонент ядра .Net. Все исходника выложены на GitHub под лицензией MIT, так что, теперь можете изучать исходники .Net без дополнительных телодвижений типа Relector, и использовать части кода в своих продуктах.&lt;div&gt;
Пока доступен код только нескольких компонент:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;ASP.NET 5&lt;/li&gt;
&lt;li&gt;EntityFramework&lt;/li&gt;
&lt;li&gt;.NET Core 5&lt;/li&gt;
&lt;li&gt;.NET Compiler Platform (&quot;Roslyn&quot;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Но, Microsoft обещает скоро выложить еще.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Лежит все тут:&amp;nbsp;&lt;a href=&quot;https://github.com/Microsoft/dotnet&quot;&gt;https://github.com/Microsoft/dotnet&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/6259669654423968948/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/11/microsoft-net-core.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/6259669654423968948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/6259669654423968948'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/11/microsoft-net-core.html' title='Microsoft открыла исходные коды .Net Core'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-2269382075052296372</id><published>2014-11-06T16:15:00.004+03:00</published><updated>2014-11-06T16:20:25.556+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><title type='text'>Что такое EntityValidationErrors и как с ним бороться.</title><content type='html'>При использовании Entity Framework вы можете столкнуться с ошибкой, гласящей &amp;quot;&lt;span style=&quot;background-color: white; font-family: Arial, &amp;#39;Liberation Sans&amp;#39;, &amp;#39;DejaVu Sans&amp;#39;, sans-serif; font-size: 14px; line-height: 17.8048000335693px;&quot;&gt;Validation failed for one or more entities. See &amp;#39;EntityValidationErrors&amp;#39; property for more details.&amp;quot; &lt;/span&gt;Причина появления этой ошибки в большинстве случаев - банальна, либо вы забыли какие ограничения существуют на полях в вашей базе данных, либо, если БД в вашей компании занимается отдельный человек, то он вам забыл о чем-то сообщить. ;)&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4c4f_U0lqIDkk6ZEZlYv8sl5Rsz01TD8oaOW0291C883PLuGf350sVyP0iPTKtrTywf0mGj66enqyS4x6mzhRFeumJlHNvb_-6DGMc4YeQ0cgeqSPPjqnI11l6Ctmr4w8yLspD8c4d8Xq/s1600/err.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4c4f_U0lqIDkk6ZEZlYv8sl5Rsz01TD8oaOW0291C883PLuGf350sVyP0iPTKtrTywf0mGj66enqyS4x6mzhRFeumJlHNvb_-6DGMc4YeQ0cgeqSPPjqnI11l6Ctmr4w8yLspD8c4d8Xq/s1600/err.jpg&quot; height=&quot;158&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
EntityValidationErrors - это коллекция объектов DbEntityValidationResult, каждый из которых содержит информацию об ошибках одной EF-сущности в виде объектов DbValidationError.&lt;br&gt;
На самом деле, ничего страшного в этой ошибке нет, и можно легко узнать в чем конкретно у нас ошибка в коде. Все, что для этого необходимо - это обернуться вызов метода SaveChanges() вот в такой блок try-catch:&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/11/entityvalidationerrors.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/2269382075052296372/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/11/entityvalidationerrors.html#comment-form' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/2269382075052296372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/2269382075052296372'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/11/entityvalidationerrors.html' title='Что такое EntityValidationErrors и как с ним бороться.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4c4f_U0lqIDkk6ZEZlYv8sl5Rsz01TD8oaOW0291C883PLuGf350sVyP0iPTKtrTywf0mGj66enqyS4x6mzhRFeumJlHNvb_-6DGMc4YeQ0cgeqSPPjqnI11l6Ctmr4w8yLspD8c4d8Xq/s72-c/err.jpg" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-4005939088449846699</id><published>2014-11-05T15:49:00.001+03:00</published><updated>2014-11-05T15:49:05.875+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><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="интересно"/><title type='text'>ASP.NET 4.5 и Unobtrusive Validation, Progressive Degradation и что это все нам дает.</title><content type='html'>В ASP.NET 4.5 среди прочих нововведений, во всю начал применяться так называемый подход Unobtrusive JavaScript, то есть, &amp;quot;ненавязчивый JavaScript&amp;quot; и использование jQuery. Эта технология уже применяется в ASP.NET MVC, по-моему, с третьей версии, и вот, теперь дело дошло и до WebForms.&lt;br&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
Что же это за зверь &amp;quot;Unobtrusive JavaScript&amp;quot;? Это относительно новый подход к разработке клиентской части web-страниц, предполагающий несколько вещей:&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Отделение поведения (JavaScript) от структуры и представления (HTML/CSS). То есть, такой своеобразный вариант клиентского MVC.&lt;/li&gt;
&lt;li&gt;Попытки избежать традиционных проблем JavaScript (т.е., максимально возвожная браузеро- и платформонезависимость и масштабируемость)&lt;/li&gt;
&lt;li&gt;Использование подхода Graceful degradation, то есть приложение должно оставаться работоспособным при использовании даже старых браузеров возможно вообще не поддерживающих JavaScript.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
В ASP.NET все эти принципы проявляются в виде Unobtrusive Validation, о которой я постараюсь вам рассказать применительно к общей концепции Unobtrusive JavaScript.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
В качестве примера давайте создадим простой web-приложение на ASP.NET 4.5 и добавим в него одну единственную страничку с текстовым полем, кнопкой и валидатором того, что текстовое поле заполнено. &lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbczXmSJLhZW3OvscGKqRuRqvOxxgPwXauPXWif9EddyW0TVbwZ8WjfhWwgPfLNi-SJRs99X92Nff5TQFWtI_T8vr-B0Llz1DelkUGWWsxuq1c7lBbLOKMoJne6RwlBvgvzj84N-yjtWM4/s1600/project_cofig2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbczXmSJLhZW3OvscGKqRuRqvOxxgPwXauPXWif9EddyW0TVbwZ8WjfhWwgPfLNi-SJRs99X92Nff5TQFWtI_T8vr-B0Llz1DelkUGWWsxuq1c7lBbLOKMoJne6RwlBvgvzj84N-yjtWM4/s1600/project_cofig2.jpg&quot; height=&quot;308&quot; width=&quot;640&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
Как вы, наверное, помните, в предыдущих версиях добавление валидатора влекло за собой добавление в код страницы целой простыни JavaScript кода. А что сейчас? Давайте попробуем запустить наш пример.&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;&lt;a href=&quot;http://www.dotnetblog.ru/2014/11/aspnet-45-unobtrusive-validation.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/4005939088449846699/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/11/aspnet-45-unobtrusive-validation.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/4005939088449846699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/4005939088449846699'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/11/aspnet-45-unobtrusive-validation.html' title='ASP.NET 4.5 и Unobtrusive Validation, Progressive Degradation и что это все нам дает.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbczXmSJLhZW3OvscGKqRuRqvOxxgPwXauPXWif9EddyW0TVbwZ8WjfhWwgPfLNi-SJRs99X92Nff5TQFWtI_T8vr-B0Llz1DelkUGWWsxuq1c7lBbLOKMoJne6RwlBvgvzj84N-yjtWM4/s72-c/project_cofig2.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-7032116948208015104</id><published>2014-11-04T11:55:00.004+03:00</published><updated>2014-11-05T11:23:02.843+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Замена пустого места на что-то осмысленное в GridView при отображении NULL-значений.</title><content type='html'>Может быть, заголовок не передает всей идеи того, о чем я хочу рассказать, так что попробую объяснить ситуацию более подробно. Наверняка, многие из вас сталкивались с чем-то подобным.&lt;br&gt;
Итак, представьте, что у нас в базе данных есть табличка примерно такого вида. Для простоты дальнейшего повествования предлагаю считать, что все поля, кроме id - nullable, так что null может быть где угодно, а не только в поле job.&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN-DRXPPiLLHt68-MiaFaCrm_C8PQnQbBbL1bZkHCyAHBafKgcOfOkmyqSgk_k7ZQVvnTmJcX6nW-HuWHn2ZY1LHJzLuA6vnsa2DK-A9TkB26jke1-FOeuY4cZZ2e5rCEetl1fD7khiH5w/s1600/dbtable.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN-DRXPPiLLHt68-MiaFaCrm_C8PQnQbBbL1bZkHCyAHBafKgcOfOkmyqSgk_k7ZQVvnTmJcX6nW-HuWHn2ZY1LHJzLuA6vnsa2DK-A9TkB26jke1-FOeuY4cZZ2e5rCEetl1fD7khiH5w/s1600/dbtable.jpg&quot; height=&quot;125&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
И мы хотим вывести данные из нее в GridView. По умолчанию у нас получится вот что:&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYN_dlFVV8_kHjnKotjE6L_0Ic0mZuUCFL9EOcKyGZMwjxP-yA5LRaAD9LUUVF4qOg342BTzan2XIzTm98A5EkynHjjdfFIFqiU9NexKQOaSzmMsZtrXOYk0gcBHkmoj76CjRoYyoNPlMB/s1600/site_table1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYN_dlFVV8_kHjnKotjE6L_0Ic0mZuUCFL9EOcKyGZMwjxP-yA5LRaAD9LUUVF4qOg342BTzan2XIzTm98A5EkynHjjdfFIFqiU9NexKQOaSzmMsZtrXOYk0gcBHkmoj76CjRoYyoNPlMB/s1600/site_table1.jpg&quot; height=&quot;229&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
Не красиво, и не очень информативно, согласитесь. Было бы более наглядно, если бы вместо пустого места вместо NULL-значений выводилось что-то более осмысленное и говорящее пользователю об истинном положении вещей.&lt;br&gt;
&lt;br&gt;
Сделать это можно двумя способами. Первый способ, для нашей задачи не очень правильный, путем создания обработчика события RowDataBound:&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/11/gridview-null.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/7032116948208015104/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/11/gridview-null.html#comment-form' title='Комментарии: 64'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7032116948208015104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7032116948208015104'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/11/gridview-null.html' title='Замена пустого места на что-то осмысленное в GridView при отображении NULL-значений.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN-DRXPPiLLHt68-MiaFaCrm_C8PQnQbBbL1bZkHCyAHBafKgcOfOkmyqSgk_k7ZQVvnTmJcX6nW-HuWHn2ZY1LHJzLuA6vnsa2DK-A9TkB26jke1-FOeuY4cZZ2e5rCEetl1fD7khiH5w/s72-c/dbtable.jpg" height="72" width="72"/><thr:total>64</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-7134438621533740146</id><published>2014-10-11T22:12:00.001+04:00</published><updated>2014-10-11T22:12:46.282+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Forms"/><title type='text'>COM Interop на примере работы с Excel</title><content type='html'>В предыдущем посте я писал о создании csv-файла и экспорта в него данных  из ASP.NET и при этом, перечисляя разные варианты, не упомянул один совсем уже бредовый для web-приложения, но частенько очень подходящий для приложений десктопных. Это работа с установленным в системе COM-объектом c помощью технологии под названием COM Interop.&lt;br&gt;
&lt;br&gt;
COM Interop используется в .Net для предоставления возможности взаимодействия управляемого .Net кода с COM-объектами. Тля того чтобы использовать какой-либо COM-объект из управляемого кода, необходимо создать сборку, содержащую информацию о типах содержащихся в COM-библиотеке, в совместимом с CRL формате.&lt;br&gt;
&lt;br&gt;
В процессе работы приложения CLR создает для каждого COM-объекта внутренний объект, называемый Runtime Callable Wrapper (Вызываемая оболочка времени выполнения) или RCW, которая используется для создания  COM-объекта и маршалинга данных между управляемой и неуправляемой средой. Также, RCW используется для мониторинга количества активных ссылок на COM-объект и его уничтожение, когда количество активных ссылок станет равным нулю. Выглядит это примерно так:&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQWrrqCFF3L-jSkM_VEI3q0KYzZA7BFVstoDaW5jmF3Skl_qmC9_UYxpwExWk6dtSRX-95eAGcumtNTjwLTGdQsQnTosXBwUD-RyiEd529w2kc-FHtcvuI6Y3_zJ6SJ6gVifj1i2yfsum3/s1600/inerop.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQWrrqCFF3L-jSkM_VEI3q0KYzZA7BFVstoDaW5jmF3Skl_qmC9_UYxpwExWk6dtSRX-95eAGcumtNTjwLTGdQsQnTosXBwUD-RyiEd529w2kc-FHtcvuI6Y3_zJ6SJ6gVifj1i2yfsum3/s1600/inerop.jpg&quot; height=&quot;163&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
Обычно, если вы ходите создать CLR библиотеку для какого-либо компонента самостоятельно, то вам нужно использовать утилиту Tlbimp.exe, но для использования компонентов Office этого делать не нужно. Все необходимые библиотеки уже устанавливаются вместе с продуктом. Нам достаточно только добавить нужную сборку в проект.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/10/com-interop-excel.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/7134438621533740146/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/10/com-interop-excel.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7134438621533740146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7134438621533740146'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/10/com-interop-excel.html' title='COM Interop на примере работы с Excel'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQWrrqCFF3L-jSkM_VEI3q0KYzZA7BFVstoDaW5jmF3Skl_qmC9_UYxpwExWk6dtSRX-95eAGcumtNTjwLTGdQsQnTosXBwUD-RyiEd529w2kc-FHtcvuI6Y3_zJ6SJ6gVifj1i2yfsum3/s72-c/inerop.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-5259490923444302007</id><published>2014-10-10T11:18:00.002+04:00</published><updated>2014-10-10T21:10:03.561+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Создаем .csv файлы в ASP.NET</title><content type='html'>Иногда возникает необходимость выгрузить какие-то данные в удобном для пользователя формате, который позволит на них не только смотреть, но и как-то обрабатывать и редактировать. Самым очевидным межплатформенным решением в таком случае видится форма CSV.&lt;br&gt;
&lt;br&gt;
Выгрузить CSV-файл с нужными данными можно несколькими способами:&lt;br&gt;
красивым и правильным, с использованием ASP.NET хэндлера (о хендлерах я как-нибудь напишу отдельно),&lt;br&gt;
изврашенным - написав консольное приложение, которое будет запускаться по определенному графику и создавать где-нибудь доступный для web-сервера файл,&lt;br&gt;
и простым и не очень правильным - просто изменив MIME-тип в ASPX-странице.&lt;br&gt;
Какой бы способ вы не выбрали, все сведется примерно к такому коду:&lt;br&gt;
&lt;br&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt; 
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(&amp;quot;1,2,3,4&amp;quot;);
            sb.AppendLine(&amp;quot;5,6,7,8&amp;quot;);
            sb.AppendLine(&amp;quot;9,10,11,12&amp;quot;);
            Response.ClearContent();
            Response.Clear();
            Response.ContentEncoding = Encoding.GetEncoding(&amp;quot;Windows-1251&amp;quot;);
            Response.ContentType = &amp;quot;application/vnd.ms-excel&amp;quot;;
            Response.AddHeader(&amp;quot;Content-Disposition&amp;quot;, &amp;quot;attachment; filename=csvfile.csv;&amp;quot;);
            Response.Write(sb.ToString());
            Response.Flush();
            Response.End();
&lt;/pre&gt;
&lt;br&gt;
Если у вас операционная система Windows и установлена англоязычная локаль, то все будет работать и вы не узнаете что есть небольшая проблема до того момента, пока кто-то из пользователей вам об этом не сообщит.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/10/csv-aspnet.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/5259490923444302007/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/10/csv-aspnet.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/5259490923444302007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/5259490923444302007'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/10/csv-aspnet.html' title='Создаем .csv файлы в ASP.NET'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNSy6Sj8Z8nKtbv-vtNkcNt7Oc27fKFvDQMIJrxQH7VJS6cS9Ktn0G0e3RoWN8reVWETjgmdxcIWdGKv_J-Wqy6U5zik1yS92oXKCcydY96JrnYng_fgdrIlaLhyphenhyphents5rKI0OlKUqVkzfE0/s72-c/1.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-5887822321391499229</id><published>2014-10-07T10:22:00.000+04:00</published><updated>2014-11-07T15:46:46.663+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><title type='text'>Как очистить таблицу с помощью Entity Framework.</title><content type='html'>Если вы используете в своем проекте Entity Framework и хотите удалить все содержимое какой-либо таблицы не используя другие подключения к БД, кроме существующего, то можете использовать один из двух вариантов.&lt;br /&gt;
&lt;br /&gt;
Вариант первый. &quot;Правильный&quot; с точки зрения EF, так как при этом отслеживается состояние объектов. По этой же причине - более медленный.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt; 
           context.YourTable.RemoveRange(context.YourTable);
           context.SaveChanges();
&lt;/pre&gt;
&lt;br /&gt;
И второй способ. Менее &quot;правильный&quot;, но зато быстрый. Если вам нужно очистить таблицу с какими-то временными, не имеющими отношений с другими объектами, то этот способ - самое оно.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;           context.Database.ExecuteSqlCommand(&quot;TRUNCATE TABLE [YourTable]&quot;);&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/5887822321391499229/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/10/entity-framework.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/5887822321391499229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/5887822321391499229'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/10/entity-framework.html' title='Как очистить таблицу с помощью Entity Framework.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-685814966701300741</id><published>2014-10-02T17:58:00.002+04:00</published><updated>2014-10-02T17:58:27.795+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Сортировка случайных строк по одной из их частей.</title><content type='html'>Недавно столкнулся с интересной задачей, общий смысл которой сводится к тому что мы получаем на вход массив строк, допустим, вида &amp;quot;1 тест&amp;quot;,&amp;quot;2 что-то еще написано&amp;quot;, и этот список нужно вернуть отсортированным по, в данном случае, первой части строки - цифре. Хочу рассказать вам о решении, может быть, кому-то пригодится.&lt;br&gt;
&lt;br&gt;
Подводный камень номер один - производительность. Если использовать для выделения первой части строки string.Split(), то производительность падает пропорционально длине строк, раз, и размеру текста - два.  Эту проблему можно решить, используя регулярные выражения.&lt;br&gt;
Например, для строк нашего типа можно сделать вот так:&lt;br&gt;
&lt;br&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt; 
    string line = &amp;quot;1 тест&amp;quot;;
    string firstNumber = Regex.Match(line, &amp;quot;^(.*?)\s.*$&amp;quot;).Groups[1].Value;
&lt;/pre&gt;
&lt;br&gt;
Подробно о результатах сравнения производительности .Split() и Regex я напишу в отдельном посте, а сейчас продолжим. Итак, мы получили первый элемент строки, по которому нам нужно сортировать, теперь нужно придумать как сортировать строки.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/10/blog-post.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/685814966701300741/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/685814966701300741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/685814966701300741'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/10/blog-post.html' title='Сортировка случайных строк по одной из их частей.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-290739913649240197</id><published>2014-09-29T18:29:00.001+04:00</published><updated>2014-09-29T18:30:54.873+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Как программно сделать скриншот.</title><content type='html'>Если когда-нибудь вам понадобиться программно сделать скриншот (ну, вдруг вы захотите облегчить жизнь пользователям и себе и решите делать скриншот автоматически в случае какой-то серьезной ошибки в вашем приложении), то нет ничего проще. Всего несколько строк кода и все готово:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt; 
     Bitmap screen;

     //в начале, нам надо получить размеры экрана.
     Rectangle screenDimensions = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
     Size s = new Size(screenDimensions.Width, screenDimensions.Height);

     //и создать соответствующее пустое изображение.
     screen = new Bitmap(s.Width, s.Height);
     Graphics memoryGraphics = Graphics.FromImage(screen);

     //вуаля! делаем скриншот.
     memoryGraphics.CopyFromScreen(0, 0, 0, 0, s);

     //и сохраняем в файл.
     screen.Save(&quot;any_filename_you_like.jpg&quot;,System.Drawing.Imaging.ImageFormat.Jpeg);
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
PS. Да, не забудьте подключить пространство имен System.Drawing.</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/290739913649240197/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/09/blog-post_29.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/290739913649240197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/290739913649240197'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/09/blog-post_29.html' title='Как программно сделать скриншот.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-6533673744309264948</id><published>2014-09-22T12:04:00.001+04:00</published><updated>2014-09-22T20:54:01.542+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Forms"/><category scheme="http://www.blogger.com/atom/ns#" term="полезное"/><title type='text'>Печатаем текст вертикально снизу вверх.</title><content type='html'>Если у вас возникнет необходимость напечатать на странице вертикальный текст идущий снизу вверх, то вы будете не приятно удивлены. Такой возможности в .Net нет. Напечатать вертикальный текст сверху-вниз элементарно, это делается буквально в пару строк:&lt;br&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;  
            StringFormat formatver = new StringFormat(StringFormatFlags.DirectionVertical);
            e.Graphics.DrawString(&amp;quot;Проверка&amp;quot;, this.Font, Brushes.Black, 0, 150, formatver);
&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
В результате получаем вот такой текст (1). Напечатать же текст (2) не прибегая к разным ухищрениям невозможно.&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiPwr-yQis4BrdD9r4M9Oa23qBvPK8Ko2zTYYq9bZqA7GiSHXDR9YPO23dCf6uxyIgLpWywP4ocN-Kfs1qEzw-taKbeByLyr6zF7qZcVwDMWyzqxBn9BEq2EzCEqBDBTzN9cvTxP8gx1Y6/s1600/20140922_114728.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiPwr-yQis4BrdD9r4M9Oa23qBvPK8Ko2zTYYq9bZqA7GiSHXDR9YPO23dCf6uxyIgLpWywP4ocN-Kfs1qEzw-taKbeByLyr6zF7qZcVwDMWyzqxBn9BEq2EzCEqBDBTzN9cvTxP8gx1Y6/s1600/20140922_114728.jpg&quot; height=&quot;400&quot; width=&quot;300&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
В сети есть разные варианты решения этой проблемы в основном сводящиеся к вращению холста с помощью Graphics.Transform. Такое решение, конечно, имеет право на жизнь, но оно, как мне кажется, далеко не самое оптимальное.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/09/blog-post.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/6533673744309264948/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/6533673744309264948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/6533673744309264948'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/09/blog-post.html' title='Печатаем текст вертикально снизу вверх.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiPwr-yQis4BrdD9r4M9Oa23qBvPK8Ko2zTYYq9bZqA7GiSHXDR9YPO23dCf6uxyIgLpWywP4ocN-Kfs1qEzw-taKbeByLyr6zF7qZcVwDMWyzqxBn9BEq2EzCEqBDBTzN9cvTxP8gx1Y6/s72-c/20140922_114728.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-3417652610371303549</id><published>2014-08-11T17:09:00.001+04:00</published><updated>2014-08-11T17:09:30.997+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><title type='text'>Как сделать сортировку по умолчанию в GridView</title><content type='html'>Если вам нужно чтобы данные в привязанном к данным (databound) GridView были по умолчанию как-то отсортированы, то, для того чтобы найти быстрое и правильное решение достаточно вспомнить о существовании у GridView такого свойства как SortExpression, которое содержит название столбца по которому в данный момент произведена сортировка. Соответственно, если данные не отсортированы, то SortExpression будет содержать пустое значение.&lt;br /&gt;
Таким образом, проверяя в Page_Load это свойство может понять является ли текущее состояние грида состоянием по умолчанию или сортировка уже применена. Если же сортировка отсутствует, то мы можем применить необходимую нам по умолчанию. Например, вот так:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(GridView1.SortExpression)) 
               GridView1.Sort(&quot;recordDate&quot;, SortDirection.Descending);
        }
&lt;/pre&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/3417652610371303549/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/08/gridview.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/3417652610371303549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/3417652610371303549'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/08/gridview.html' title='Как сделать сортировку по умолчанию в GridView'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2431668099949260719.post-7749359703401791636</id><published>2014-07-24T11:24:00.001+04:00</published><updated>2015-01-19T09:36:16.192+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="для новичков"/><title type='text'>Функции ранжирования в MS SQL </title><content type='html'>Как вы наверняка знаете, в реляционных базах данных строки в таблице не имеют порядка. Можно, конечно, использовать дополнительные механизмы, например IDENTITY-столбец, но это все равно не поможет вам получить, например, порядок строки в результатах запроса. Для возможности как-то соотносить порядок одних строк с другими и придуманы функции ранжирования. Прежде чем я перейду к рассказу о них, отмечу один важный момент: все ранжирующие функции являются недетерминированными, то есть результат их выполнения каждый раз может быть разным (хотя, на одном и том же наборе данных, один и тот же запрос будет возвращать один и тот же результат).&lt;br&gt;
&lt;br&gt;
Итак, собственно, функции ранжирования. Представим, что у нас есть вот такая табличка:&lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZWBnJ7gRY2sHlwV_xwa83gRX9bacrqzwph9TFMFjLgA7UvtFJEnhETb3AVrJlBrHLPSXaXiRnB5L3nQRSZRgd0g1x4K5mwmvXsAE9e36xt5t-ju97W8wVTwbRr1Ont6945DagMftYZfCa/s1600/rownum1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZWBnJ7gRY2sHlwV_xwa83gRX9bacrqzwph9TFMFjLgA7UvtFJEnhETb3AVrJlBrHLPSXaXiRnB5L3nQRSZRgd0g1x4K5mwmvXsAE9e36xt5t-ju97W8wVTwbRr1Ont6945DagMftYZfCa/s1600/rownum1.jpg&quot; height=&quot;116&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
И мы хотим получить порядок строк отсортированных по типу оборудования. Для этого можно использовать функция ROW_NUMBER().&lt;br&gt;
&lt;br&gt;
&lt;pre class=&quot;brush: sql&quot;&gt;SELECT ROW_NUMBER() OVER (ORDER BY PositionType DESC) as RowNumber
      ,[maker]
      ,[positionName]
      ,[positionType]
      ,[price]
  FROM [test].[dbo].[rowNumbering]

&lt;/pre&gt;
&lt;br&gt;
В результате выполнения этого запроса мы получим вот такой результат:&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz9VrqM4onxG4FvGyTQIgFTCEQb3m_0Z-hwM9ylELucZJQoElkxcpkcYWV1zBV9f7t2YRWEM2oAaBylDsLxZBe6C94ppO4J-P0LD1sdni1Lpvik_WbaqdlFlj9cp-5viyA1AJXv_0R9IJ2/s1600/rownum_rownum.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz9VrqM4onxG4FvGyTQIgFTCEQb3m_0Z-hwM9ylELucZJQoElkxcpkcYWV1zBV9f7t2YRWEM2oAaBylDsLxZBe6C94ppO4J-P0LD1sdni1Lpvik_WbaqdlFlj9cp-5viyA1AJXv_0R9IJ2/s1600/rownum_rownum.jpg&quot; height=&quot;107&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
Как вы заметили, для указания на базе какого столбца будет сделана нумерация в запросе используется конструкция ORDER BY. На больших наборах данных из-за этого может пострадать производительность, но, если порядок следования рядов в результате выдачи вам не важен, то сортировки можно избежать, используя примерно такую конструкцию:&lt;br&gt;
&lt;br&gt;
&lt;pre class=&quot;brush: sql&quot;&gt;SELECT ROW_NUMBER() OVER (ORDER BY (SELECT TOP 1 1 FROM [test].[dbo].[rowNumbering])) as RowNumber
      ,[maker]
      ,[positionName]
      ,[positionType]
      ,[price]
  FROM [test].[dbo].[rowNumbering]

&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.dotnetblog.ru/2014/07/ms-sql.html#more&quot;&gt;Дальше »&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.dotnetblog.ru/feeds/7749359703401791636/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.dotnetblog.ru/2014/07/ms-sql.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7749359703401791636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2431668099949260719/posts/default/7749359703401791636'/><link rel='alternate' type='text/html' href='http://www.dotnetblog.ru/2014/07/ms-sql.html' title='Функции ранжирования в MS SQL '/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZWBnJ7gRY2sHlwV_xwa83gRX9bacrqzwph9TFMFjLgA7UvtFJEnhETb3AVrJlBrHLPSXaXiRnB5L3nQRSZRgd0g1x4K5mwmvXsAE9e36xt5t-ju97W8wVTwbRr1Ont6945DagMftYZfCa/s72-c/rownum1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry></feed>