Старый 27.08.2008, 16:01   #1 (permalink)
Модератор
/*ASP*/
 
Аватар для desant
 
Специализация: Кодер
Регистрация: 17.07.2008
Адрес: Город-герой Подольск
Сообщений: 145
Репутация: 67
Восклицание asp.net БД - это легка! Добавим динамики!

Копирование данного материала запрещено без письменного разрешения автора.

Добрый день читатель!
Сегодня мы рассмотрим создание WebService, ScriptServiceи использование некоторых Data-компонентов. И так приступим.
Для начала я приведу код модулей доступа к БД, немного измененный с последнего раза
Оффтоп
Напишем небольшой WebService, который будет возвращать DataSetсо всеми данными из таблицы.

Код:
 
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class TestTableFetcher
    Inherits System.Web.Services.WebService
 
   <WebMethod()> _
   Public Function getTestList() As Data.DataSet
       Dim da As New TestTable
       Return da.TestMethods(SQLDataBase.SQLVariant.SqlSelect)
   End Function
End Class
Теперь добавляем на default.aspx2 контролла. ObjectDataSourceи GridView. Привязывает источник данных к нашему сервису, а GridViewк источнику данных.
Код:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="XHTML namespace" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="getTestList" TypeName="TestTableFetcher"></asp:ObjectDataSource>
        <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1">
        </asp:GridView>
    </div>
    </form>
</body>
</html>
Запускаем. Все данные из таблицы отобразились у нас на страничке. Только как-то не красиво, да и не все данные нам нужны. Начинаем настраивать объект GridView
Код:
        <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="lngTestID" HeaderText="Номер" />                
                <asp:BoundField DataField="strName" HeaderText="Название" />
                <asp:TemplateField HeaderText="Название">
                    <ItemTemplate>
                        <span>Ухты!</span>
                        <asp:Label ID="lbl_Name" runat="server" Text=<%# eval("strName") %> ></asp:Label>
                        <br />
                        <asp:Label ID="lbl_Chet" runat="server" Text=<%# CanDo(eval("lngTestID")) %> ></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>        
        </asp:GridView>
Сейчас у нас используется 2 вида столбцов : asp:BoundField и asp:TemplateField
Первый – стандартный, для простого отображения (в GridViewих несколько видов, легко изучить их все самостоятельно)
Второй (на нем мы остановимся по подробней) – столбец собственного содержания. Как видно из примера данные к нему привязываются командой Eval(«Название столбца»). В TemplateField можно «пихать» любые элементы и почти ко всем свойствам привязывать данные, насколько хватит фантазии. Во 2ом TemplateField я использую еще и серверную функцию CanDo.
Код:
    Function CanDo(ByVal lngId As String) As String
        Try
            Dim ID As Integer = CInt(lngId)
            If ID Mod 2 = 0 Then
                Return "Чёт блин"
            Else
                Return "Нечет"
            End If
        Catch ex As Exception
            Return "Хозяина ты не права"
        End Try
    End Function
CanDoвозвращает некоторые значения в зависимости от IDзаписи. Как видите все легко и понятно. Очень удобно в зависимости от какого-то «ключика» ставить элементу visibleв trueили false.
С этим разобрались. Учищаем страничку.

WebService– отличается от WebServiceтолько тем, что его можно «вызывать» из скрипта. Обычный код VB.NET(на чем у нам написан модуль для доступа к БД) , будет вызываться из скрипта. Посмотрим, что из этого можно извлечь.
Добавим в web.config несколько строчек
Код:
<system.web>
 <compilation debug="true" strict="false" explicit="true">
  <assemblies>
   <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
   <add assembly="System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
   <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
   <add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  </assemblies>
 </compilation>
 <pages>
  <controls>
   <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </controls>
 </pages>
 <httpHandlers>
  <remove path="*.asmx" verb="*"/>
  <add path="*.asmx" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
  <add path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
  <add path="ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
  <add path="CrystalImageHandler.aspx" verb="GET" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.2.3600.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
  <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
 </httpHandlers>
 <httpModules>
  <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
 </httpModules>
</system.web>

Добавимобычный WebService, назовемего ScriptService(уберитегалочку Place code in separate file)
Код:
<%@ WebService Language="VB" Class="ScriptService1.Test1" %>
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Web.Script.Services
Namespace ScriptService1
    <WebService(Namespace:="Index of /")> _
    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
    <ScriptService()> _
    Public Class Test1
        Inherits System.Web.Services.WebService
        <WebMethod()> _
        Public Function getPeopleList()
            Dim Arr(,) As String
            ReDim Arr(1, 3)
            Arr(0, 0) = "0"
            Arr(1, 0) = "Школьник"
            Arr(0, 1) = "1"
            Arr(1, 1) = "Студент"
            Arr(0, 2) = "2"
            Arr(1, 2) = "Работник"
            Arr(0, 3) = "3"
            Arr(1, 3) = "Программист"
            Return Arr
        End Function
 
        <WebMethod()> _
        Public Function getDoList(ByVal IDPeople)
            Dim Arr(,) As String
            ReDim Arr(1, 1)
            Select Case IDPeople
                Case 0
                    Arr(0, 0) = "0"
                    Arr(1, 0) = "учиться"
                    Arr(0, 1) = "1"
                    Arr(1, 1) = "играть на PC"
                Case 1
                    Arr(0, 0) = "0"
                    Arr(1, 0) = "пить пиво"
                    Arr(0, 1) = "1"
                    Arr(1, 1) = "любить девочек"
                Case 2
                    Arr(0, 0) = "0"
                    Arr(1, 0) = "работать"
                    Arr(0, 1) = "1"
                    Arr(1, 1) = "любить жену"
                Case 3
                    Arr(0, 0) = "0"
                    Arr(1, 0) = "перекодировка пива в код"
                    Arr(0, 1) = "1"
                    Arr(1, 1) = "пить пиво"
            End Select
            Return Arr
        End Function
    End Class
End Namespace
В коде можно (чаще нужно!) использовать данные из БД, но для теста хватит и имитации.
Теперь осталось сделать страничку с небольшим кодом, которые подгружает данные из сервиса и добавляет их в select.
Код:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="XHTML namespace" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptLocalization="true" EnableScriptGlobalization="true" ScriptMode="Auto">
        <Services>
            <asp:ServiceReference  Path="ScriptService.asmx" />
        </Services>
        </asp:ScriptManager>        
    <div>
        <select id="Select1"  onclick="LoadSelect2();">
        </select>
        <select id="Select2" onclick="ShowSelected();">
        </select>
        <br />
        <span id="txt"></span>
     </div>     
    </form>
</body>
<script>
function LoadSelect1()
{    
    ScriptService1.Test1.getPeopleList(ReturnValuesForSelect1);
}
function ReturnValuesForSelect1(result)
{
    addValueToSelect(document.getElementById("Select1"),result);
}
function LoadSelect2()
{
    var obj=document.getElementById("Select1");
    document.getElementById("txt").innerText=""
    ScriptService1.Test1.getDoList(obj.options[obj.selectedIndex].value,ReturnValuesForSelect2);
}
function ReturnValuesForSelect2(result)
{  
    addValueToSelect(document.getElementById("Select2"),result);
}
function addValueToSelect(objSel,result)
{
    var sum;
    objSel.options.length = 0;    
    for (var i=0;i<result.length/2;i++)
    {
        sum=i+result.length/2;
        objSel.options[objSel.options.length] = new Option(result[sum],result[i]);
    }
}
function ShowSelected()
{
    var objTxt=document.getElementById("txt");
    var obj=document.getElementById("Select1");
    var obj1=document.getElementById("Select2");
    objTxt.innerText="Вы " + obj.options[obj.selectedIndex].text + " любящий " + obj1.options[obj1.selectedIndex].text
}
</script>
<script


Спасибо читатель за уделенное время и ….
…Лучшие знания достаются с мозолями на пальцах (с) desant
__________________
Интелект - величина постоянная.
А количество людей все время возрастает...

Журнал по миру web-a

Последний раз редактировалось desant; 27.08.2008 в 16:02.
desant вне форума  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl this Post!Reddit! Wong this Post! Добавить в закладки Google
Ответить с цитированием
Этот пользователь отблагодарил desant за это сообщение:
Kurbatov (27.08.2008)
Ответ

Метки
asp.net


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения



Часовой пояс GMT +4, время: 16:52.
Powered by vBulletin® Version 7.51.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Web Mastering By Devil Art