Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
által Scott Mitchell
Ebben az oktatóanyagban egy gazdagabb szerkesztőfelületet hozunk létre a DataListhez, amely tartalmazza a legördülő listákat és a jelölőnégyzeteket.
Bevezetés
A DataList jelölő és webes vezérlői EditItemTemplate
határozzák meg a szerkeszthető felületet. Az eddig megvizsgált összes szerkeszthető DataList-példában a szerkeszthető felület TextBox Web-vezérlőkből állt. Az előző oktatóanyagban a szerkesztési idő felhasználói élményét az érvényesítési vezérlők hozzáadásával javítottuk.
Ez EditItemTemplate
tovább bővíthető úgy, hogy a Szövegdoboztól eltérő webes vezérlőket is tartalmazzon, például legördülő listákat, radiobuttonlistákat, naptárakat stb. A TextBoxeshez hasonlóan a szerkesztőfelület más webes vezérlőkre való testreszabásakor is hajtsa végre a következő lépéseket:
- Adja hozzá a webvezérlőt a
EditItemTemplate
. - A databinding szintaxissal rendelje hozzá a megfelelő adatmező értékét a megfelelő tulajdonsághoz.
- Az
UpdateCommand
eseménykezelőben programozottan érje el a Web-vezérlő értékét, és adja át a megfelelő BLL-metódusnak.
Ebben az oktatóanyagban egy gazdagabb szerkesztőfelületet hozunk létre a DataListhez, amely tartalmazza a legördülő listákat és a jelölőnégyzeteket. Létrehozunk egy DataListet, amely felsorolja a termékinformációkat, és lehetővé teszi a termék nevének, szállítójának, kategóriájának és megszűnt állapotának frissítését (lásd az 1. ábrát).
1. ábra: A szerkesztőfelület tartalmaz egy szövegdobozt, két legördülő listát és egy jelölőnégyzetet (kattintással megtekintheti a teljes méretű képet)
1. lépés: Termékinformációk megjelenítése
Mielőtt létrehozhatnánk a DataList szerkeszthető felületét, először meg kell valósítanunk az írásvédett felületet. Először nyissa meg a CustomizedUI.aspx
lapot a EditDeleteDataList
mappából, és a Tervezőből vegyen fel egy DataListet a lapra, majd állítsa be a ID
tulajdonságot Products
értékre. A DataList intelligens címkéje alapján hozzon létre egy új ObjectDataSource-t. Nevezze el ezt az új ObjectDataSource-t ProductsDataSource
, és konfigurálja úgy, hogy adatokat kérjen le az ProductsBLL
osztály metódusából GetProducts
. Az előző szerkeszthető DataList-oktatóanyagokhoz hasonlóan a szerkesztett termékinformációkat úgy frissítjük, hogy közvetlenül az üzleti logikai rétegre lépünk. Ennek megfelelően állítsa a legördülő listákat az UPDATE, INSERT és DELETE füleken a (Nincs) értékre.
2. ábra: Állítsa a FRISSÍTÉS, BESZÚRÁS és TÖRLÉS lap Drop-Down listákat (Nincs) értékre (Kattintson ide a teljes méretű kép megtekintéséhez)
Az ObjectDataSource konfigurálása után a Visual Studio létrehoz egy alapértelmezett értéket ItemTemplate
a DataListhez, amely felsorolja az egyes visszaadott adatmezők nevét és értékét. Módosítsa úgy, ItemTemplate
hogy a sablon egy <h4>
elem terméknevét, valamint a kategória nevét, a szállító nevét, az árat és a megszűnt állapotot listázza. Ezenkívül adjon hozzá egy Szerkesztés gombot, és győződjön meg arról, hogy a CommandName
tulajdonsága Szerkesztés értékre van állítva. A deklaratív jelölés a következő ItemTemplate
:
<ItemTemplate>
<h4>
<asp:Label ID="ProductNameLabel" runat="server"
Text='<%# Eval("ProductName") %>' />
</h4>
<table border="0">
<tr>
<td class="ProductPropertyLabel">Category:</td>
<td class="ProductPropertyValue">
<asp:Label ID="CategoryNameLabel" runat="server"
Text='<%# Eval("CategoryName") %>' />
</td>
<td class="ProductPropertyLabel">Supplier:</td>
<td class="ProductPropertyValue">
<asp:Label ID="SupplierNameLabel" runat="server"
Text='<%# Eval("SupplierName") %>' />
</td>
</tr>
<tr>
<td class="ProductPropertyLabel">Discontinued:</td>
<td class="ProductPropertyValue">
<asp:Label ID="DiscontinuedLabel" runat="server"
Text='<%# Eval("Discontinued") %>' />
</td>
<td class="ProductPropertyLabel">Price:</td>
<td class="ProductPropertyValue">
<asp:Label ID="UnitPriceLabel" runat="server"
Text='<%# Eval("UnitPrice", "{0:C}") %>' />
</td>
</tr>
<tr>
<td colspan="4">
<asp:Button runat="Server" ID="EditButton"
Text="Edit" CommandName="Edit" />
</td>
</tr>
</table>
<br />
</ItemTemplate>
A fenti korrektúra a termékinformációkat <a termék nevének h4> fejlécével és a fennmaradó mezők négy oszlopával <table>
határozza meg.
ProductPropertyLabel
és ProductPropertyValue
CSS-osztályokat, amelyek a Styles.css
-ban vannak definiálva, a korábbi oktatóanyagokban tárgyaltuk. A 3. ábra a böngészőn keresztüli megtekintéskor mutatja az előrehaladást.
3. ábra: Megjelenik az egyes termékek neve, szállítója, kategóriája, megszűnt állapota és ára (ide kattintva megtekintheti a teljes méretű képet)
2. lépés: A webes vezérlők hozzáadása a szerkesztőfelülethez
A testre szabott DataList-szerkesztőfelület létrehozásának első lépése a szükséges webvezérlők hozzáadása a EditItemTemplate
. Különösen szükségünk van egy legördülő listára a kategóriához, egy másikra a szállítóhoz, és egy jelölőnégyzetre a megszűnt állapothoz. Mivel a termék ára ebben a példában nem szerkeszthető, továbbra is megjeleníthetjük a Címke webvezérlővel.
A szerkesztőfelület testreszabásához kattintson a DataList intelligens címkéjének Sablonok szerkesztése hivatkozására, és válassza ki a legördülő listából a EditItemTemplate
lehetőséget. Adjon hozzá egy legördülő listát a EditItemTemplate
, és állítsa be a ID
értékét Categories
-ra.
4. ábra: Legördülő lista hozzáadása a kategóriákhoz (ide kattintva megtekintheti a teljes méretű képet)
Ezután a DropDownList intelligens címkéje közül válassza az Adatforrás kiválasztása lehetőséget, és hozzon létre egy új ObjectDataSource nevű CategoriesDataSource
objektumot. Konfigurálja az ObjectDataSource-t úgy, hogy a CategoriesBLL
osztály GetCategories()
metódusát használja (lásd az 5. ábrát). Ezután a DropDownList adatforrás-konfigurációs varázslója felszólít az egyes ListItem
adatmezők és Text
Value
tulajdonságok kiválasztására. A Legördülő lista megjelenítse az CategoryName
adatmezőt, és használja értékként CategoryID
a 6. ábrán látható módon.
5. ábra: Új ObjectDataSource névvel ellátott CategoriesDataSource
objektum létrehozása (ide kattintva megtekintheti a teljes méretű képet)
6. ábra: A DropDownList megjelenítési és értékmezőinek konfigurálása (ide kattintva megtekintheti a teljes méretű képet)
Ismételje meg ezt a lépéssorozatot, és hozzon létre egy legördülő listát a szállítók számára. Állítsa be a ID
legördülő lista Suppliers
értékét, és nevezze el az ObjectDataSource-t SuppliersDataSource
.
A két legördülő lista hozzáadása után adjon hozzá egy jelölőnégyzetet a megszűnt állapothoz, és egy Szövegmezőt a termék nevéhez. Állítsa be a ID
jelölőnégyzetet és a Discontinued
szövegdobozt ProductName
értékre, a megfelelő sorrendben. Adjon hozzá egy RequiredFieldValidatort, amely biztosítja, hogy a felhasználó értéket adjon a termék nevének.
Végül adja hozzá a Frissítés és a Mégse gombot. Ne feledje, hogy ehhez a két gombhoz elengedhetetlenül fontos, hogy a tulajdonságaik CommandName
Frissítés és Mégse értékre legyenek állítva.
Nyugodtan helyezze el a szerkesztőfelületet tetszés szerint. Úgy döntöttem, hogy ugyanazt a négyoszlopos <table>
elrendezést használom az írásvédett felületen, ahogy az alábbi deklaratív szintaxis és képernyőfelvétel szemlélteti:
<EditItemTemplate>
<h4>
<asp:Label ID="ProductNameLabel" runat="server"
Text='<%# Eval("ProductName") %>' />
</h4>
<table border="0">
<tr>
<td class="ProductPropertyLabel">Name:</td>
<td colspan="3" class="ProductPropertyValue">
<asp:TextBox runat="server" ID="ProductName" Width="90%" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
ControlToValidate="ProductName"
ErrorMessage="You must enter a name for the product."
runat="server">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td class="ProductPropertyLabel">Category:</td>
<td class="ProductPropertyValue">
<asp:DropDownList ID="Categories" runat="server"
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName" DataValueField="CategoryID" />
</td>
<td class="ProductPropertyLabel">Supplier:</td>
<td class="ProductPropertyValue">
<asp:DropDownList ID="Suppliers"
DataSourceID="SuppliersDataSource" DataTextField="CompanyName"
DataValueField="SupplierID" runat="server" />
</td>
</tr>
<tr>
<td class="ProductPropertyLabel">Discontinued:</td>
<td class="ProductPropertyValue">
<asp:CheckBox runat="server" id="Discontinued" />
</td>
<td class="ProductPropertyLabel">Price:</td>
<td class="ProductPropertyValue">
<asp:Label ID="UnitPriceLabel" runat="server"
Text='<%# Eval("UnitPrice", "{0:C}") %>' />
</td>
</tr>
<tr>
<td colspan="4">
<asp:Button runat="Server" ID="UpdateButton" CommandName="Update"
Text="Update" />
<asp:Button runat="Server" ID="CancelButton" CommandName="Cancel"
Text="Cancel" CausesValidation="False" />
</td>
</tr>
</table>
<br />
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}" SelectMethod="GetCategories"
TypeName="CategoriesBLL">
</asp:ObjectDataSource>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
OldValuesParameterFormatString="original_{0}" SelectMethod="GetSuppliers"
TypeName="SuppliersBLL">
</asp:ObjectDataSource>
</EditItemTemplate>
7. ábra: A szerkesztőfelület a Read-Only felülethez hasonlóan van elhelyezve (kattintson ide a teljes méretű kép megtekintéséhez)
3. lépés: Az EditCommand és a CancelCommand eseménykezelők létrehozása
Jelenleg nincs adatkötési szintaxis a EditItemTemplate
-ban (kivéve a UnitPriceLabel
-t, amelyet a ItemTemplate
-ből szó szerint átmásoltak). A databinding szintaxist azonnal hozzáadjuk, de először hozzuk létre a DataList s és EditCommand
események eseménykezelőitCancelCommand
. Ne feledje, hogy az EditCommand
eseménykezelő feladata annak a DataList-elemnek a szerkesztőfelületének renderelése, amelynek Szerkesztés gombjára kattintott, míg a CancelCommand
feladat a DataList előzetes szerkesztési állapotba való visszaírása.
Hozza létre ezt a két eseménykezelőt, és használja a következő kódot:
Protected Sub Products_EditCommand(source As Object, e As DataListCommandEventArgs) _
Handles Products.EditCommand
' Set the DataList's EditItemIndex property to the
' index of the DataListItem that was clicked
Products.EditItemIndex = e.Item.ItemIndex
' Rebind the data to the DataList
Products.DataBind()
End Sub
Protected Sub Products_CancelCommand(source As Object, e As DataListCommandEventArgs) _
Handles Products.CancelCommand
' Set the DataList's EditItemIndex property to -1
Products.EditItemIndex = -1
' Rebind the data to the DataList
Products.DataBind()
End Sub
E két eseménykezelő beállítása után a Szerkesztés gombra kattintva megjelenik a szerkesztőfelület, és a Mégse gombra kattintva a szerkesztett elem visszavált az írásvédett módra. A 8. ábrán a DataList látható, miután a Szerkesztés gombra kattintott a Chef Anton s Gumbo Mixhez. Mivel még nem vettünk fel adatkötési szintaxist a szerkesztőfelületre, a ProductName
Szövegdoboz üres, a Discontinued
jelölőnégyzet nincs bejelölve, és az első elemek a Categories
Suppliers
legördülő listából lettek kiválasztva.
8. ábra: A Szerkesztés gombra kattintva megjeleníti a szerkesztőfelületet (ide kattintva megtekintheti a teljes méretű képet)
4. lépés: A DataBinding szintaxis hozzáadása a szerkesztőfelülethez
Ahhoz, hogy a szerkesztőfelület megjelenítse az aktuális termékértékeket, adatkötési szintaxissal kell hozzárendelnünk az adatmezőértékeket a megfelelő webvezérlő értékekhez. Az adatkötés szintaxisa a Tervezőn keresztül alkalmazható a Sablonok szerkesztése képernyőre lépve, és a Webvezérlők intelligens címkéi között válassza a DataBindings szerkesztése hivatkozást. Másik lehetőségként az adatkötés szintaxisa közvetlenül hozzáadható a deklaratív korrektúrajelhez.
Rendelje hozzá az ProductName
adatmező értékét a ProductName
TextBox Text
tulajdonságához, a CategoryID
és SupplierID
adatmező értékeit az Categories
és Suppliers
DropDownList SelectedValue
tulajdonságaihoz, az Discontinued
adatmező értékét pedig a Discontinued
Jelölőnégyzet Checked
tulajdonságához. Miután végrehajtotta ezeket a módosításokat, akár a Tervezőn keresztül, akár közvetlenül a deklaratív korrektúra használatával, tekintse meg újra az oldalt egy böngészőben, és kattintson a Chef Anton s Gumbo Mix Szerkesztés gombjára. Ahogy a 9. ábra mutatja, az adatkötés szintaxisa hozzáadta az aktuális értékeket a Szövegdoboz, a Legördülő listák és a Jelölőnégyzet mezőhöz.
9. ábra: A Szerkesztés gombra kattintva megjeleníti a szerkesztőfelületet (ide kattintva megtekintheti a teljes méretű képet)
5. lépés: A felhasználó módosításainak mentése az UpdateCommand eseménykezelőben
Amikor a felhasználó szerkeszt egy terméket, és a Frissítés gombra kattint, visszaadás történik, és a DataList UpdateCommand
eseménye aktiválódik. Az eseménykezelőben be kell olvasnunk a webes vezérlők EditItemTemplate
értékeit, majd kapcsolatot kell létesítenünk a BLL-lel, hogy frissítsük a terméket az adatbázisban. Ahogy a korábbi oktatóanyagokban láttuk, a ProductID
frissített termék elérhető a DataKeys
gyűjteményen keresztül. A felhasználó által megadott mezőket úgy érheti el, hogy programozott módon hivatkozik a webes vezérlőkre FindControl("controlID")
a következő kód szerint:
Protected Sub Products_UpdateCommand(source As Object, e As DataListCommandEventArgs) _
Handles Products.UpdateCommand
If Not Page.IsValid Then
Exit Sub
End If
' Read in the ProductID from the DataKeys collection
Dim productID As Integer = Convert.ToInt32(Products.DataKeys(e.Item.ItemIndex))
' Read in the product name and price values
Dim productName As TextBox = CType(e.Item.FindControl("ProductName"), TextBox)
Dim categories As DropDownList=CType(e.Item.FindControl("Categories"), DropDownList)
Dim suppliers As DropDownList = CType(e.Item.FindControl("Suppliers"), DropDownList)
Dim discontinued As CheckBox = CType(e.Item.FindControl("Discontinued"), CheckBox)
Dim productNameValue As String = Nothing
If productName.Text.Trim().Length > 0 Then
productNameValue = productName.Text.Trim()
End If
Dim categoryIDValue As Integer = Convert.ToInt32(categories.SelectedValue)
Dim supplierIDValue As Integer = Convert.ToInt32(suppliers.SelectedValue)
Dim discontinuedValue As Boolean = discontinued.Checked
' Call the ProductsBLL's UpdateProduct method...
Dim productsAPI As New ProductsBLL()
productsAPI.UpdateProduct(productNameValue, categoryIDValue, supplierIDValue, _
discontinuedValue, productID)
' Revert the DataList back to its pre-editing state
Products.EditItemIndex = -1
Products.DataBind()
End Sub
A kód úgy indul, hogy meghívja a Page.IsValid
tulajdonságot annak biztosítására, hogy az oldalon található összes érvényesítési vezérlő elem helyesen működjön. Ha a Page.IsValid
True
, a szerkesztett termék ProductID
értékét a rendszer a DataKeys
gyűjteményből olvassa be, és az adatbevitel webes vezérlőit EditItemTemplate
programozottan hivatkozza. Ezután a webvezérlők értékei olyan változókba lesznek beolvasva, amelyek aztán a megfelelő UpdateProduct
túlterhelésbe kerülnek. Az adatok frissítése után a DataList visszakerül a szerkesztés előtti állapotába.
Megjegyzés:
Kihagytam a BLL- és DAL-Level Kivételek kezelése oktatóanyagban hozzáadott kivételkezelési logikát a kód és a példa összpontosítása érdekében. Gyakorlatként adja hozzá ezt a funkciót az oktatóanyag elvégzése után.
6. lépés: NULL CategoryID és SupplierID értékek kezelése
A Northwind-adatbázis lehetővé teszi a NULL
értékeket az Products
tábla CategoryID
és SupplierID
oszlopaiban. A szerkesztőfelület azonban jelenleg nem fogad el NULL
értékeket. Ha olyan terméket próbálunk szerkeszteni, amely NULL
vagy annak CategoryID
vagy SupplierID
oszlopainak értékét tartalmazza, a következőhöz hasonló hibaüzenet jelenik meg ArgumentOutOfRangeException
: "Kategóriák" egy SelectedValue értékkel rendelkezik, amely érvénytelen, mert nem szerepel az elemek listájában. Emellett jelenleg nem lehet egy termékkategóriát vagy szállítói értéket nem értékrőlNULL
egyre NULL
módosítani.
A kategória és szállító legördülő listák értékeinek támogatásához egy további NULL
értéket kell hozzáadnunk ListItem
. Úgy döntöttem, hogy a (Nincs) értéket fogom használni ezen Text
értékeként, de megváltoztathatod valami másra (például egy üres karakterláncra), ha szeretnéd. Végül ne felejtse el beállítani a DropDownLists-t a AppendDataBoundItems
-re; ha elfelejti ezt megtenni, a DropDownListhez kapcsolódó kategóriák és szállítók felül fogják írni a statikusan hozzáadott True
-t.
A módosítások elvégzése után a DataList s legördülő listáinak a következőhöz hasonlóan kell kinézniük EditItemTemplate
:
<asp:DropDownList ID="Categories" DataSourceID="CategoriesDataSource"
DataTextField="CategoryName" DataValueField="CategoryID" runat="server"
SelectedValue='<%# Eval("CategoryID") %>' AppendDataBoundItems="True">
<asp:ListItem Value=" Selected="True">(None)</asp:ListItem>
</asp:DropDownList>
...
<asp:DropDownList ID="Suppliers" DataSourceID="SuppliersDataSource"
DataTextField="CompanyName" DataValueField="SupplierID" runat="server"
SelectedValue='<%# Eval("SupplierID") %>' AppendDataBoundItems="True">
<asp:ListItem Value=" Selected="True">(None)</asp:ListItem>
</asp:DropDownList>
Megjegyzés:
Statikus ListItem
s-eket a Tervezőn vagy közvetlenül a deklaratív szintaxison keresztül adhat hozzá a DropDownListhez. Amikor dropDownList-elemet ad hozzá az adatbázis NULL
értékének megjelenítéséhez, mindenképpen adja hozzá a ListItem
deklaratív szintaxison keresztül. Ha a Tervezőben a ListItem
Gyűjteményszerkesztőt használja, a létrehozott deklaratív szintaxis teljesen kihagyja a Value
beállítást, amikor egy üres sztringet rendel hozzá, és deklaratív korrektúrát hoz létre, például: <asp:ListItem>(None)</asp:ListItem>
. Bár ez ártalmatlannak tűnhet, a hiányzó Value
érték miatt a DropDownList a helyén használja a Text
tulajdonságértéket. Ez azt jelenti, hogy ha ez NULL
ListItem
ki van választva, a rendszer megkísérli hozzárendelni a (Nincs) értéket a termékadatmezőhöz (CategoryID
vagy SupplierID
ebben az oktatóanyagban), ami kivételt eredményez. Explicit beállítással Value=""
egy NULL
érték lesz hozzárendelve a termékadatmezőhöz a NULL
ListItem
kijelöléskor.
Szánjon egy kis időt a haladás megtekintésére egy böngészőben. Ha szerkeszt egy terméket, vegye figyelembe, hogy a Categories
és Suppliers
legördülő listák elején van egy (Nincs) lehetőség.
10. ábra: A Categories
Suppliers
legördülő listák tartalmazzák a (Nincs) lehetőséget (ide kattintva megtekintheti a teljes méretű képet)
A (Nincs) beállítás adatbázis-értékként NULL
való mentéséhez vissza kell térnünk az UpdateCommand
eseménykezelőhöz. Módosítsa a categoryIDValue
és supplierIDValue
változókat nullázható egész számokká, és rendeljen hozzájuk értéket, ami nem Nothing
, csak akkor, ha a DropDownList SelectedValue
nem üres sztring.
Dim categoryIDValue As Nullable(Of Integer) = Nothing
If Not String.IsNullOrEmpty(categories.SelectedValue) Then
categoryIDValue = Convert.ToInt32(categories.SelectedValue)
End If
Dim supplierIDValue As Nullable(Of Integer) = Nothing
If Not String.IsNullOrEmpty(suppliers.SelectedValue) Then
supplierIDValue = Convert.ToInt32(suppliers.SelectedValue)
End If
Ezzel a módosítással egy érték Nothing
lesz átadva a UpdateProduct
BLL-metódusnak, ha a felhasználó a (Nincs) lehetőséget választotta valamelyik legördülő listából, amely egy NULL
adatbázis-értéknek felel meg.
Összefoglalás
Ebben az oktatóanyagban egy összetettebb DataList-szerkesztőfelületet hoztunk létre, amely három különböző beviteli webvezérlőt tartalmazott, egy TextBoxot, két DropDownList-et és egy jelölőnégyzetet az érvényesítési vezérlőkkel együtt. A szerkesztőfelület létrehozásakor a lépések ugyanazok, függetlenül a használt webes vezérlőktől: először adja hozzá a webvezérlőket a DataList s-hez EditItemTemplate
; használja a databinding szintaxist a megfelelő adatmezőértékek hozzárendeléséhez a megfelelő webvezérlő tulajdonságaival; és az eseménykezelőben UpdateCommand
programozott módon hozzáférjen a webes vezérlőkhöz és azok megfelelő tulajdonságaihoz, adja át az értékeiket a BLL-be.
Szerkesztőfelület létrehozásakor , akár csak TextBoxokból vagy különböző webvezérlők gyűjteményéből áll, ügyeljen arra, hogy megfelelően kezelje az adatbázis-értékeket NULL
. Az NULL
számvitelében elengedhetetlen, hogy ne csak helyesen jelenítsen meg egy meglévő NULL
értéket a szerkesztőfelületen, hanem arra is kínáljon megoldást, hogy egy értéket NULL
jelölhessen. A DataLists DropDownListjei esetében ez általában azt jelenti, hogy hozzáadunk egy statikus ListItem
elemet, amelynek Value
tulajdonsága explicit módon üres sztringre van állítva (Value=""
), és hozzáadunk egy kis kódot az UpdateCommand
eseménykezelőhöz, annak érdekében, hogy megállapítsuk, a NULL``ListItem
ki van-e választva.
Boldog programozást!
Tudnivalók a szerzőről
Scott Mitchell, hét ASP/ASP.NET-könyv szerzője és a 4GuysFromRolla.com alapítója, 1998 óta dolgozik a Microsoft webtechnológiáival. Scott független tanácsadóként, edzőként és íróként dolgozik. Legújabb könyve Sams Teach Yourself ASP.NET 2.0 24 óra alatt. Itt érhető el mitchell@4GuysFromRolla.com.
Külön köszönet
Ezt az oktatóanyag-sorozatot sok hasznos véleményező áttekintette. Az oktatóanyag vezető véleményezői Dennis Patterson, David Suru és Randy Schmidt voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.