﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel>
    <title>Piotrosz</title>
    <description>.NET's not dead</description>
    <link>http://www.piotrosz.aspnet.pl/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 2.0.0.36</generator>
    <language>pl-PL</language>
    <blogChannel:blogRoll>http://www.piotrosz.aspnet.pl/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Piotrosz</dc:creator>
    <dc:title>Piotrosz</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <item>
      <title>Zmiana adresu</title>
      <description>&lt;p&gt;Ta strona niedługo zdechnie. Blog jest teraz dostępny pod adresem:&lt;/p&gt;

&lt;a href="http://www.piotrludwiczuk.net"&gt;piotrludwiczuk.net&lt;/a&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/Zmiana-adresu.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/Zmiana-adresu.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=9c811ee5-530b-4820-a892-4ecd5b50f842</guid>
      <pubDate>Sun, 16 Oct 2011 16:26:00 +0600</pubDate>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=9c811ee5-530b-4820-a892-4ecd5b50f842</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=9c811ee5-530b-4820-a892-4ecd5b50f842</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/Zmiana-adresu.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=9c811ee5-530b-4820-a892-4ecd5b50f842</wfw:commentRss>
    </item>
    <item>
      <title>Przykład walidacji NIP i PESEL przy wykorzystaniu  System.ComponentModel.DataAnnotations.ValidationAttribute</title>
      <description>&lt;p&gt;Klasa modelu z walidatorami NIP i PESEL (atrybuty):&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [Required(ErrorMessage="PESEL jest obowiązkowy")]
    [PeselValidation(ErrorMessage="PESEL jest nieprawidłowy")]
    public string Pesel { get; set; }

    [NipValidation(ErrorMessage="NIP jest nieprawidłowy")]
    public string Nip { get; set; }
}
&lt;/pre&gt;
&lt;p&gt;Walidacja w akcji kontrolera (ASP.NET MVC):&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public class PersonController : Controller
{
    [HttpPost]
    public ActionResult Create(Person person)
    {
        if (!ModelState.IsValid)
            return View(person);
        else
            return Content("Walidacja się powiodła!");
    }
}
&lt;/pre&gt;
&lt;p&gt;Atrybut: walidator PESEL:&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public class PeselValidationAttribute : ValidationAttribute
{
    private static readonly int[] multipliers = { 1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1 };

    public override bool IsValid(object value)
    {
        if (value == null)
            return true;

        string pesel = value as string;

        if (pesel == null || !Regex.IsMatch(pesel, @"^\d{11}$"))
            return false;

        int sum = 0;

        for (int i = 0; i &amp;lt; 11; i++)
            sum += multipliers[i] * int.Parse(pesel.Substring(i, 1));

        return sum % 10 == 0;
    }
}
&lt;/pre&gt;
&lt;p&gt;Atrybut: walidator NIP:&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public class NipValidationAttribute : ValidationAttribute
{
    private readonly int[] multipliers = { 6, 5, 7, 2, 3, 4, 5, 6, 7 };

    public override bool IsValid(object value)
    {
        if (value == null)
            return true;

        string nip = value as string;

        if (nip == null || !Regex.IsMatch(nip, @"^[\d]{10}$"))
            return false;

        int sum = 0;
        for (int i = 8; i &amp;gt;= 0; i--)
            sum += multipliers[i] * int.Parse(nip.Substring(i, 1));

        return ((sum % 11) == 10 ? false : ((sum % 11) == int.Parse(nip.Substring(9, 1))));
    }
}
&lt;/pre&gt;
&lt;p&gt;Takie atrybuty łatwo jest przetestować (tutaj test walidatora PESEL):&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;[TestClass]
public class PeselValidationTest
{
    PeselValidationAttribute target;

    [TestInitialize]
    public void Init()
    {
        target = new PeselValidationAttribute();
    }

    [TestMethod]
    public void TestValid()
    {
        // Act
        bool valid1 = target.IsValid("13040659673");
        bool valid2 = target.IsValid("03281336758");
        bool valid3 = target.IsValid("23210899855");
        bool valid4 = target.IsValid(null);

        // Assert
        Assert.AreEqual(true, valid1);
        Assert.AreEqual(true, valid2);
        Assert.AreEqual(true, valid3);
    }

    [TestMethod]
    public void TestInvalid()
    {
        // Act
        bool invalid1 = target.IsValid("");
        bool invalid2 = target.IsValid("abc");
        bool invalid3 = target.IsValid("86031212134");
        bool invalid4 = target.IsValid("5464");
        bool invalid5 = target.IsValid(23210899855);
        bool invalid6 = target.IsValid("232108998555");

        // Assert
        Assert.AreEqual(false, invalid1);
        Assert.AreEqual(false, invalid2);
        Assert.AreEqual(false, invalid3);
        Assert.AreEqual(false, invalid4);
        Assert.AreEqual(false, invalid5);
        Assert.AreEqual(false, invalid6);
    }
}
&lt;/pre&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/Przykład-walidacji-NIP-i-PESEL-przy-wykorzystaniu-SystemComponentModelDataAnnotationsValidationAttribute.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/Przykład-walidacji-NIP-i-PESEL-przy-wykorzystaniu-SystemComponentModelDataAnnotationsValidationAttribute.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=04d85097-cb72-43e0-b1cf-bcc5b40a846b</guid>
      <pubDate>Wed, 05 Oct 2011 02:14:00 +0600</pubDate>
      <category>ASP.NET MVC</category>
      <category>C#</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=04d85097-cb72-43e0-b1cf-bcc5b40a846b</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=04d85097-cb72-43e0-b1cf-bcc5b40a846b</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/Przykład-walidacji-NIP-i-PESEL-przy-wykorzystaniu-SystemComponentModelDataAnnotationsValidationAttribute.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=04d85097-cb72-43e0-b1cf-bcc5b40a846b</wfw:commentRss>
    </item>
    <item>
      <title>Dodawanie atrybutów do automatycznie wygenerowanych klas partial</title>
      <description>&lt;p&gt;Czasami potrzeba dodać atrybuty do właściwości/metod klasy, kt&amp;oacute;ra została stworzona automatycznie przez jakiś designer (na przykład przez ORM). Modyfikowanie klasy bezpośrednio nie ma sensu, ponieważ może ona zostać nadpisana i nasze zmiany zostaną niestety utracone. Atrybuty takie można określić w oddzielnym pliku.  &lt;br /&gt;&lt;br /&gt; Czyli na przykład zamiast:&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;using System;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

public class Product
{
    [HiddenInput(DisplayValue=false)]
    public int Id { get; set; }
    
    [DisplayName("Name of the product")]
    [Required(ErrorMessage="Please enter a product name")]
    [StringLength(200)]
    public string Name { get; set; }

    [Required]
    [Range(0.01, double.MaxValue, ErrorMessage="Cena musi mieć wartość dodatnią")]
    public decimal Price { get; set; }
}
&lt;/pre&gt;
&lt;p&gt;Można klasę &lt;em&gt;Product&lt;/em&gt; zostawić bez atrybut&amp;oacute;w (ale musi być ona &lt;em&gt;partial&lt;/em&gt;):&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;public partial class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}
&lt;/pre&gt;
&lt;p&gt;i dodać atrybut &lt;a href="http://msdn.microsoft.com/en-us/library/cc679243.aspx"&gt;MetadataType&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="brush:csharp"&gt;[MetadataType(typeof(ProductMetadata))]
public partial class Product
{
    class ProductMetadata
    {
        [HiddenInput(DisplayValue = false)]
        public int Id { get; set; }

        [DisplayName("Name of the product")]
        [Required(ErrorMessage = "Please enter a product name")]
        [StringLength(200)]
        public string Name { get; set; }

        [Required]
        [Range(0.01, double.MaxValue, ErrorMessage = "Please enter a positive price")]
        public decimal Price { get; set; }
    }
}

&lt;/pre&gt;
&lt;p&gt;Dzięki temu atrybuty klasy są zdefiniowane w innym pliku niż klasa. Jak widać klasa definująca metadane (tzw. &lt;i&gt;buddy class&lt;/i&gt;) może być zdefiniowana wewnątrz klasy docelowej.&lt;/p&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/Dodawanie-atrybutow-do-automatycznie-wygenerowanych-klas-partial.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/Dodawanie-atrybutow-do-automatycznie-wygenerowanych-klas-partial.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=de8231fc-04bc-4cec-b214-63a860b173f5</guid>
      <pubDate>Fri, 26 Aug 2011 05:07:00 +0600</pubDate>
      <category>C#</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=de8231fc-04bc-4cec-b214-63a860b173f5</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=de8231fc-04bc-4cec-b214-63a860b173f5</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/Dodawanie-atrybutow-do-automatycznie-wygenerowanych-klas-partial.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=de8231fc-04bc-4cec-b214-63a860b173f5</wfw:commentRss>
    </item>
    <item>
      <title>jQuery - zamienniki kontrolek z AJAX Control Toolkit</title>
      <description>&lt;p&gt;&lt;a href="http://www.itgroup.com.ph/alphanumeric/"&gt;http://www.itgroup.com.ph/alphanumeric/&lt;/a&gt;&amp;nbsp;- odpowiednik FilteredTextBox&lt;/p&gt;
&lt;p&gt;&lt;a href="http://digitalbush.com/projects/masked-input-plugin/"&gt;http://digitalbush.com/projects/masked-input-plugin/&lt;/a&gt;&amp;nbsp;- odpowiednik MaskedEdit&lt;/p&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/jQuery-aplhanumeric-plugin.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/jQuery-aplhanumeric-plugin.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=1a262146-3655-491b-9504-48f762333203</guid>
      <pubDate>Tue, 19 Jul 2011 19:04:00 +0600</pubDate>
      <category>ASP.NET</category>
      <category>jQuery</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=1a262146-3655-491b-9504-48f762333203</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=1a262146-3655-491b-9504-48f762333203</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/jQuery-aplhanumeric-plugin.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=1a262146-3655-491b-9504-48f762333203</wfw:commentRss>
    </item>
    <item>
      <title>jQuery ajax w aplikacji ASP.NET</title>
      <description>2 przykłady z zastosowaniem asynchronicznego odświeżania strony przy użyciu biblioteki jQuery.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Pobranie jQuery oraz IntelliSense&lt;/b&gt;
&lt;br/&gt;&lt;br/&gt;
jQuery można pobrać managerem pakietów &lt;a href="http://nuget.codeplex.com/"&gt;NuGet&lt;/a&gt;:
&lt;pre&gt;
Install-Package jQuery
&lt;/pre&gt;
Jest to dość fajny sposób, ponieważ dzięki temu błyskawicznie ściągną się i dodadzą do projektu 3 pliki: jquery-*-vsdoc.js, jquery-*.js, jquery-*.min.js.
&lt;br/&gt;
&lt;br/&gt;

Plik jquery-*-vsdoc.js zapewnia działanie &lt;a href="http://msdn.microsoft.com/en-us/library/bb385682.aspx"&gt;JScript IntelliSense&lt;/a&gt; w Visual Studio.
Aby podpowiedzi były wyświetlane z poziomu innego pliku javascript należy dopisać sobie odpowiednią linijkę na początku pliku .js:
&lt;pre&gt;
/// &amp;lt;reference path="jquery-1.6.1-vsdoc.js" /&amp;gt;
&lt;/pre&gt;
Więcej o tym &lt;a href="http://blogs.msdn.com/b/webdevtools/archive/2007/11/06/jscript-intellisense-a-reference-for-the-reference-tag.aspx"&gt;tutaj&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Zwracanie pojedynczej wartości poprzez obiekt JSON&lt;/b&gt;:
&lt;br/&gt;
&lt;br/&gt;
Kod na stronie aspx:
&lt;pre class="brush:xml"&gt;
&amp;lt;p&amp;gt;1 wartość:&amp;lt;/p&amp;gt;
&amp;lt;asp:TextBox runat="server" ID="TextBox1" ClientIDMode="Static" Enabled="false" /&amp;gt;
&amp;lt;input type="button" value="ajax random" id="Button1" /&amp;gt;
&amp;lt;hr /&amp;gt;
&lt;/pre&gt;

Po kliknięciu na guzik (&lt;i&gt;Button1&lt;/i&gt;), dzięki poniższemu małemu kodowi javascript, po stronie serwera, bez odświeżenia strony zostanie wykonana metoda &lt;i&gt;GetRandomValue&lt;/i&gt;. Kod ten zawiera wywołanie magicznej funkcji &lt;i&gt;&lt;a href="http://api.jquery.com/jQuery.ajax/"&gt;jQuery.ajax()&lt;/a&gt;&lt;/i&gt;:

&lt;pre class="brush:javascript"&gt;
$(function () {
    $("#Button1").click(function () {
        $.ajax({
            type: "POST",
            url: "WebForm1.aspx/GetRandomDouble",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                document.getElementById('TextBox1').value = msg.d;
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
            }
        });
    });
});
&lt;/pre&gt;

Wspomniana testowa metoda po stronie serwera wygląda tak (musi być statyczna i mieć atrybut [WebMethod]:
&lt;pre class="brush:csharp"&gt;
[WebMethod]
public static double GetRandomDouble()
{
    Random r = new Random();
    return r.NextDouble();
}
&lt;/pre&gt;

&lt;img src="http://www.piotrosz.aspnet.pl/image.axd?picture=2011%2f6%2fjQueryAJAX1.png" alt="" /&gt;
&lt;br/&gt;&lt;br/&gt;

&lt;b&gt;Zwracanie listy obiektów oraz przekazywanie parametrów do metody serwerowej.&lt;/b&gt;
&lt;br/&gt;&lt;br/&gt;
Kod na stronie aspx:
&lt;pre class="brush:xml"&gt;
&amp;lt;p&amp;gt;Lista obiektów:&amp;lt;/p&amp;gt;
&amp;lt;span id="spanResult"&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;input type="button" value="ajax with params" id="Button2" /&amp;gt;
&lt;/pre&gt;
Funkcja javascript, w której przekazywane są parametry do metody po stronie serwera (GetSomeItems) przy użyciu notacji &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt;:
&lt;pre class="brush:javascript"&gt;
$(function () {
    $("#Button2").click(function () {
        $.ajax({
            type: "POST",
            url: "WebForm1.aspx/GetSomeItems",
            data: "{'prmBoolean' : true, 'prmString': 'Baobab', 'prmDecimal': 10902.33}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                var html = "";
                for (var item in msg.d)
                    html += "&lt;p&gt;" + msg.d[item].Name + " " + msg.d[item].Price + " " + msg.d[item].Discounted + "&lt;/p&gt;";

                document.getElementById('spanResult').innerHTML = html;
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
            }
        });
    });
});
&lt;/pre&gt;
Testowa metoda po stronie serwera:
&lt;pre class="brush:csharp"&gt;
[WebMethod]
public static List&lt;Item&gt; GetSomeItems(bool prmBoolean, string prmString, decimal prmDecimal)
{
    return new List&lt;Item&gt;()
    {
        new Item() { Name = prmString, Price = prmDecimal * 2m, Discounted = !prmBoolean },
        new Item() { Name = "Słoń", Price = 666m, Discounted = true }
    };
}
&lt;/pre&gt;
&lt;i&gt;Item&lt;/i&gt; to oczywiście niezbyt skomplikowana testowa klasa z trzema właściwościami.
&lt;br/&gt;&lt;br/&gt;
&lt;img src="http://www.piotrosz.aspnet.pl/image.axd?picture=2011%2f6%2fjQueryAJAX2.png" alt="" /&gt;
&lt;br/&gt;&lt;br/&gt;
Do podglądania przesyłanych obiektów JSON można użyć firebuga:
&lt;br/&gt;&lt;br/&gt;

&lt;img src="http://www.piotrosz.aspnet.pl/image.axd?picture=2011%2f6%2ffirebug.png" alt="" style="width:655px"/&gt;

&lt;p&gt;Testowa aplikacja do pobrania: &lt;a href="http://www.piotrosz.aspnet.pl/file.axd?file=2011%2f6%2fjQueryAjax.zip"&gt;jQueryAjax.zip (535,24 kb)&lt;/a&gt;&lt;/p&gt;

Przy okazji zwracania kolekcji obiektów można skorzystać z &lt;a href="http://jtemplates.tpython.com/"&gt;jTemplates&lt;/a&gt;.

&lt;p&gt;Zastosowanie jQuery do zapytań ajaxowych jest bardzo proste, a do tego moim zdaniem o wiele bardziej elastyczne niż stosowanie UpdatePaneli oraz wyraźnie szybsze niż ASP.NET AJAX.&lt;/p&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/jQuery-ajax-w-aplikacji-ASPNET.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/jQuery-ajax-w-aplikacji-ASPNET.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=97c61a9b-e0b7-46bb-809a-8a4d7ee89732</guid>
      <pubDate>Thu, 02 Jun 2011 20:00:00 +0600</pubDate>
      <category>ajax</category>
      <category>ASP.NET</category>
      <category>C#</category>
      <category>JavaScript</category>
      <category>jQuery</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=97c61a9b-e0b7-46bb-809a-8a4d7ee89732</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=97c61a9b-e0b7-46bb-809a-8a4d7ee89732</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/jQuery-ajax-w-aplikacji-ASPNET.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=97c61a9b-e0b7-46bb-809a-8a4d7ee89732</wfw:commentRss>
    </item>
    <item>
      <title>Debuggowanie kodu javascript w Visual Studio</title>
      <description>W plikach aspx oraz js można &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/07/19/vs-2008-javascript-debugging.aspx"&gt;normalnie dodać break point&lt;/a&gt;, używając myszki lub klawisza F9. Nie można tego zrobić na przykład w plikach .ascx (User controls) lub w kodzie javascript tworzonym z poziomu kodu serwerowego. W takim przypadku można się ratować dopisaniem słówka:

&lt;pre&gt;
debugger
&lt;/pre&gt;

Odpowiada to postawieniu break pointa (F9):
&lt;br/&gt;&lt;br/&gt; 
&lt;img src="http://www.piotrosz.aspnet.pl/image.axd?picture=2011%2f6%2fjScript_debugger2.png" alt="" /&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/Debuggowanie-kodu-javascript-w-Visual-Studio.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/Debuggowanie-kodu-javascript-w-Visual-Studio.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=4eea9aa1-c48d-4b74-bbb0-e8b46a418d68</guid>
      <pubDate>Thu, 02 Jun 2011 18:42:00 +0600</pubDate>
      <category>ASP.NET</category>
      <category>JavaScript</category>
      <category>Visual Studio</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=4eea9aa1-c48d-4b74-bbb0-e8b46a418d68</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=4eea9aa1-c48d-4b74-bbb0-e8b46a418d68</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/Debuggowanie-kodu-javascript-w-Visual-Studio.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=4eea9aa1-c48d-4b74-bbb0-e8b46a418d68</wfw:commentRss>
    </item>
    <item>
      <title>jQuery UI dialog po przeładowaniu strony</title>
      <description>&lt;a href="http://jqueryui.com/demos/dialog/"&gt;jQuery UI dialog&lt;/a&gt; umieszczony w aplikacji ASP.NET nie zawsze zachowuje się dobrze. Jeśli wewnątrz warstwy, która pojawia się jako zawartość dialogu, jest jakaś kontrolka serwerowa (taka jak TextBox), to po PostBacku jej wartość się czyści.
Ten człowiek znalazł na to sposób:
&lt;a href="http://www.pdsys.org/blog/post/2009/06/25/Making-jQuery-UIe28099s-Dialog-Work-With-ASPNet.aspx"&gt;
http://www.pdsys.org/blog/post/2009/06/25/Making-jQuery-UIe28099s-Dialog-Work-With-ASPNet.aspx&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
Zamiast &lt;i&gt;dialog()&lt;/i&gt; można zastosować &lt;i&gt;dialog().parent().appendTo($('form:first'))&lt;/i&gt;:
&lt;pre class="brush:javascript"&gt;
&amp;lt;script type="text/javascript"&amp;gt;
$(function () {
    $('#obrazek1').click(function () {
        $('#div1').dialog({ 
            width: 25;
            height: 150, 
            title: 'Dialog tytuł',
            modal : true
        }).parent().appendTo($('form:first'));
    });
});
&amp;lt;/script&amp;gt;

&amp;lt;img src="1.gif" id="obrazek1"/&amp;gt;
&amp;lt;div id="div1"&amp;gt;
  &amp;lt;asp:TextBox runat="server" ID="TextBox1" /&amp;gt;
&amp;lt;/div&amp;gt; 
&lt;/pre&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/jQuery-dialog-po-przeładowaniu-strony.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/jQuery-dialog-po-przeładowaniu-strony.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=ca49ff4b-fbaf-4976-84ff-4439fe9baf4b</guid>
      <pubDate>Fri, 27 May 2011 20:00:00 +0600</pubDate>
      <category>ASP.NET</category>
      <category>jQuery</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=ca49ff4b-fbaf-4976-84ff-4439fe9baf4b</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=ca49ff4b-fbaf-4976-84ff-4439fe9baf4b</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/jQuery-dialog-po-przeładowaniu-strony.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=ca49ff4b-fbaf-4976-84ff-4439fe9baf4b</wfw:commentRss>
    </item>
    <item>
      <title>DefaultButton</title>
      <description>Kontrolka Panel w ASP.NET ma przydatną właściwość DefaultButton, która mówi który guzik (IButtonControl) ma być "kliknięty" po naciśnięciu ENTER.
&lt;br/&gt;&lt;br/&gt;
Przykład. Wciścięcie ENTER odpowiada kliknięciu na LinkButton1:
&lt;pre class="brush:xml"&gt;
&amp;lt;asp:Panel ID="Panel1" runat="server" DefaultButton="LinkButton1"&amp;gt;
    &amp;lt;asp:LinkButton ID="LinkButton1" Text="Link button" runat="server"/&amp;gt;
    &amp;lt;asp:LinkButton ID="LinkButton2" Text="Link button 2" runat="server"/&amp;gt;
&amp;lt;/asp:Panel&amp;gt;

&lt;/pre&gt;

Oto jaki HTML się tworzy:
&lt;pre class="brush:xml"&gt;
 &amp;lt;div id="MainContent_Panel1" onkeypress="javascript:return WebForm_FireDefaultButton(event, &amp;#39;MainContent_LinkButton1&amp;#39;)"&amp;gt;
&lt;/pre&gt;

Dokładniejsza informacja:&lt;br/&gt;

&lt;a href="http://kpumuk.info/asp-net/using-panel-defaultbutton-property-with-linkbutton-control-in-asp-net/"&gt;http://kpumuk.info/asp-net/using-panel-defaultbutton-property-with-linkbutton-control-in-asp-net/&lt;/a&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/DefaultButton.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/DefaultButton.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=f8f8f5f5-6811-4ec8-9884-253ea2899dbf</guid>
      <pubDate>Wed, 25 May 2011 17:02:00 +0600</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=f8f8f5f5-6811-4ec8-9884-253ea2899dbf</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=f8f8f5f5-6811-4ec8-9884-253ea2899dbf</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/DefaultButton.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=f8f8f5f5-6811-4ec8-9884-253ea2899dbf</wfw:commentRss>
    </item>
    <item>
      <title>Zdarzenie w kontrolce użytkownika (.ascx)</title>
      <description>W kodzie kontrolki (ascx.cs):
&lt;pre class="brush:csharp"&gt;
public partial class UserControl1 : UserControl
{
   ...
   public event EventHandler ValueChanged;
   ...
   protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
   {
       if (this.ValueChanged != null)
          this.ValueChanged(sender, new EventArgs());
   }
   ...
}
&lt;/pre&gt;
Na stronie aspx:
&lt;pre class="brush:xml"&gt;
&amp;lt;uc1:UserControl1 ID="UserControl11" runat="server" OnValueChanged="UserControl11_ValueChanged"  /&amp;gt;
&lt;/pre&gt;

Na kodzie strony (aspx.cs):
&lt;pre class="brush:csharp"&gt; 
public void UserControl11_ValueChanged(object sender, EventArgs e)
{
   ...
}
&lt;/pre&gt;

</description>
      <link>http://www.piotrosz.aspnet.pl/post/Zdarzenie-w-kontrolce-uzytkownika-(ascx).aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/Zdarzenie-w-kontrolce-uzytkownika-(ascx).aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=a263eba7-09be-4a24-809e-b352efa75e55</guid>
      <pubDate>Tue, 17 May 2011 19:19:00 +0600</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=a263eba7-09be-4a24-809e-b352efa75e55</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=a263eba7-09be-4a24-809e-b352efa75e55</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/Zdarzenie-w-kontrolce-uzytkownika-(ascx).aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=a263eba7-09be-4a24-809e-b352efa75e55</wfw:commentRss>
    </item>
    <item>
      <title>Wyłączanie ograniczania zasobów na liście</title>
      <description>Całkowite wyłączenie ograniczania zasobów na liście (&lt;i&gt;list throttling&lt;/i&gt;, &lt;i&gt;list view threshold&lt;/i&gt;) za pomocą skryptu PowerShell:

&lt;a href='http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?PageType=4&amp;ListId={72C1C85B-1D2D-4A4A-90DE-CA74A7808184}&amp;pID=420'&gt;http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?PageType=4&amp;ListId={72C1C85B-1D2D-4A4A-90DE-CA74A7808184}&amp;pID=420&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.piotrosz.aspnet.pl/file.axd?file=2011%2f5%2fmakeexceptionlist.ps1"&gt;makeexceptionlist.ps1 (2.85 kb)&lt;/a&gt;&lt;/p&gt;</description>
      <link>http://www.piotrosz.aspnet.pl/post/Wyłaczanie-ograniczania-zasobow-na-liscie.aspx</link>
      <comments>http://www.piotrosz.aspnet.pl/post/Wyłaczanie-ograniczania-zasobow-na-liscie.aspx#comment</comments>
      <guid>http://www.piotrosz.aspnet.pl/post.aspx?id=b87f36a3-f135-45e4-ac60-91893b644124</guid>
      <pubDate>Tue, 17 May 2011 19:14:00 +0600</pubDate>
      <category>PowerShell</category>
      <dc:publisher>piotrosz</dc:publisher>
      <pingback:server>http://www.piotrosz.aspnet.pl/pingback.axd</pingback:server>
      <pingback:target>http://www.piotrosz.aspnet.pl/post.aspx?id=b87f36a3-f135-45e4-ac60-91893b644124</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.piotrosz.aspnet.pl/trackback.axd?id=b87f36a3-f135-45e4-ac60-91893b644124</trackback:ping>
      <wfw:comment>http://www.piotrosz.aspnet.pl/post/Wyłaczanie-ograniczania-zasobow-na-liscie.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.piotrosz.aspnet.pl/syndication.axd?post=b87f36a3-f135-45e4-ac60-91893b644124</wfw:commentRss>
    </item>
  </channel>
</rss>