Nadszedł czas na kolejny wpis z cyklu SharePoint application pages. Na koniec poprzedniego wpisu widzieliśmy, że dla nowego elementu potrzebujemy strony, która by była kontenerem dla niego. W moim przypadku to “WorkFlow01_New.aspx”. Oczywiście można sobie wyobrazić, że ten sam formularz będzie wykorzystywany do różnych zadań, ale byłoby to zbyt skomplikowane i chaotyczne. Dodajemy nową application page do naszego projektu w Visual Studio, a następnie dodajemy do modułu “PlaceHolderMain” następujące kontrolki: 5 etykiet, 4 pola tekstowe, 1 kontrolkę kalendarza oraz przycisk.
Problematyczne jest to, że przy projektowaniu stron aplikacji nie mamy dostępu do graficznego designera w Visual Studio, a więc niestety nie jesteśmy w stanie zobaczyć naszego projekt od razu, musimy używać innych narzędzi aby widzieć jak w rzeczywistości będzie wyglądała nasza strona. Poniżej moja prosta strona, jak widać nie jest to nic skomplikowanego.
[code language="csharp"]</pre> <asp:ContentID=”PageHead”ContentPlaceHolderID=”PlaceHolderAdditionalPageHead”runat=”server”> </asp:Content> <asp:ContentID=”Main”ContentPlaceHolderID=”PlaceHolderMain”runat=”server”> <tablewidth=”1000″> <tr> <td><asp:LabelID=”LbInvoiceNumber”runat=”server” Text=”InvoiceNumber”> </asp:Label></td> <td><asp:LabelID=”LbInvoiceDate”runat=”server”Text=”InvoiceDate”> </asp:Label></td> <td><asp:LabelID=”LbInvoiceAmount”runat=”server”Text=”InvoiceAmount”> </asp:Label></td> <td><asp:LabelID=”LbSupplier”runat=”server”Text=”Supplier”> </asp:Label></td> <td><asp:LabelID=”LbPurchaseOrder”runat=”server”Text=”PurchaseOrder”> </asp:Label></td> </tr> <tr> <td><asp:TextBoxID=”InvoiceNumber”runat=”server”></asp:TextBox></td> <td><asp:CalendarID=”InvoiceDate”runat=”server”></asp:Calendar></td> <td><asp:TextBoxID=”InvoiceAmount”runat=”server”></asp:TextBox></td> <td><asp:TextBoxID=”Supplier”runat=”server”></asp:TextBox></td> <td><asp:TextBoxID=”PurchaseOrder”runat=”server”></asp:TextBox></td> </tr> </table> <asp:ButtonID=”SaveToList”runat=”server”Text=”Save to list”OnClick=”SaveList”on/> </asp:Content> <asp:ContentID=”PageTitle”ContentPlaceHolderID=”PlaceHolderPageTitle”runat=”server”> Application Page </asp:Content> <asp:ContentID=”PageTitleInTitleArea”ContentPlaceHolderID=”PlaceHolderPageTitleInTitleArea”runat=”server”> My Application Page </asp:Content> <pre> [/code]

Teraz nadszedł moment aby stworzyć metodę, która prześle zawartość naszego formularza do listy. Gdy korzystamy ze stron aplikacyjnych wszystko co się dzieje zależy od nas, a tym samym bez oprogramowania przycisku na stronie nic by się nie wydarzyło. Jak widać w kodzie strony, już umieściłem kod dla zdarzenia OnClick w kontrolce przycisk. Kod jest następujący:
[code language="csharp"] protectedvoid SaveList(object sender, EventArgs e) { SPList list = SPContext.Current.Web.Lists.TryGetList("Financial Workflow List"); SPListItem newItem = list.Items.Add(); newItem["InvoiceNr"]=InvoiceNumber.Text.ToString() ; newItem["InvoiceDt"]=InvoiceDate.SelectedDate ; newItem["InvoiceAm" ]=InvoiceAmount.Text ; newItem["Supplier" ]=Supplier.Text.ToString (); newItem["PurchaseOrder"]=PurchaseOrder.Text.ToString() ; newItem.Update(); HttpContext context = HttpContext.Current; if (HttpContext.Current.Request.QueryString["IsDlg"] != null) { context.Response.Write("<script type=’text/javascript’>window.frameElement.commitPopup()</script>"); context.Response.Flush(); context.Response.End(); }}} [/code]
No dobrze co takiego robimy? Pierwsza część kodu tworzy instancję naszej listy. Następnie przypisujemy odpowiednio zawartość naszych kontrolek do listy, by w końcu wywołać metodę Update() aby przesłać wszystko do listy. Na sam koniec musimy usunąć SharePoint application pages z ekranu, a jednocześnie ta ostatnia część odświeża zawartość listy. I to wszystko. Wkrótce postaram się stworzyć kolejną część serii, która będzie bazowała na SharePoint application pages i na tym co stworzyliśmy do tej pory, a doda dalsze opcje.