Come strutturare un modulo d'ordine basato su XML usando ASP.NET

1

Prima domanda qui; per favore aiutami se sto facendo qualcosa di sbagliato.

Sono un grafico che sta cercando di insegnare a se stesso ASP.NET/C#. Il mio background sul lato server è PHP / WordPress e alcuni ASP Classic, e quando faccio codice ho codificato a mano praticamente tutto da quando ho iniziato ad imparare l'HTML. Quindi, come ho iniziato a imparare .NET, il mio codice è stato molto manuale e procedurale.

Ora sto provando a creare un modulo d'ordine veramente semplice che estrae da un file XML per popolare il modulo; c'è un'immagine, un titolo, un prezzo e quantità selezionabili. Se stavo facendo questo modulo come un file HTML statico, avrei ogni campo chiamato manualmente e così via postback potrei interrogare ogni campo per ottenere i valori. Ma sto provando a farlo dinamicamente in modo da poter aggiungere / rimuovere elementi dal modulo e non dover modificare il codice.

In termini di visualizzazione dell'XML, ho eseguito il rollover del mio caricando XmlDocument e utilizzando XmlNodeList e un mucchio di foreach loops per visualizzare le cose. Quindi, ho imparato a conoscere <asp:XmlDataSource> e <asp:Repeater> , il che ha reso la visualizzazione XML più semplice con un ampio margine. Tuttavia, ho avuto davvero difficoltà a trovare i dati che sono stati inviati sul postback (era implicito in SO che ci sono modi migliori per ottenere i dati di nested RepeaterItems ).

Quindi, quello che ho imparato finora è che puoi fare le cose in un sacco di modi diversi in .NET. è per questo che ho pensato che sarebbe stato utile chiedere risposte sul modo migliore di utilizzare ASP.NET per visualizzare un documento XML e acquisire dinamicamente i dati inviati.

Qualsiasi aiuto è apprezzato! Sto usando Notepad ++ per codificare .NET 2.0.

    
posta Brendan 12.11.2012 - 20:20
fonte

1 risposta

3

Penso che parte del problema che potresti incontrare sia che ASP.Net cerchi di gestire la denominazione degli elementi per il tuo quando viene reso al client, quindi nella tua pagina ASP puoi nominare il tuo controllo "txtFirstName" ma all'interno di un reapeater annidato assomiglierà a "Repeater1 $ ctl00 $ Repeater2 $ ctl00 $ txtFirstName." Probabilmente lo sapete già, ma il problema è quando rendete gli oggetti dinamici, come caricati da XmlDataSource, che non fa il mapping per voi indietro al nome. Puoi ancora utilizzare l'oggetto Request per estrarre i valori.

Quindi, ad esempio, ho rimosso l'esempio XmlDataSource da MSDN ( link ) e aggiunto alcune caselle di controllo al ripetitore annidato che contiene gli ordini. Quando faccio clic su Invia, solo come test, visualizzo la raccolta Params dall'oggetto Richiesta e se contengono l'ID delle caselle di controllo che sto cercando, visualizzo il loro valore.

Fammi sapere se questo ti aiuta o se ne hai bisogno di altro.

Di seguito è riportato il codice

order.xml:

    <?xml version="1.0" encoding="iso-8859-1"?>
    <orders>
        <order>
        <customer id="12345" />
            <customername>
                <firstn>John</firstn>
                <lastn>Smith</lastn>
            </customername>
        <transaction id="12345" />
        <shipaddress>
            <address1>1234 Tenth Avenue</address1>
            <city>Bellevue</city>
            <state>Washington</state>
            <zip>98001</zip>
        </shipaddress>
        <summary>
           <item dept="tools">screwdriver</item>
           <item dept="tools">hammer</item>
           <item dept="plumbing">fixture</item>
        </summary>
      </order>
    </orders>

E la pagina web:

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head id="Head1" runat="server">
    <title>Order</title>
    <script runat="server">
        void btnGetSubmit_Click(Object sender, EventArgs e)
        {
            foreach (string c in this.Request.Params)
            {
                if (c.IndexOf("chkIncludeItem", StringComparison.InvariantCultureIgnoreCase) > -1)
                {
                    Response.Write(string.Format("{0} - {1}<br />", c, this.Request.Params[c]));
                }
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
      <asp:XmlDataSource
        runat="server"
        id="XmlDataSource1"
        XPath="orders/order"
        DataFile="order.xml" />

      <asp:Repeater ID="Repeater1"
        runat="server"
        DataSourceID="XmlDataSource1">
        <ItemTemplate>
            <h2>Order</h2>
            <table>
              <tr>
                <td>Customer</td>
                <td><%#XPath("customer/@id")%></td>
                <td id="tdFirstName"><%#XPath("customername/firstn")%></td>
                <td id="tdLastName"><%#XPath("customername/lastn")%></td>
              </tr>
              <tr>
                <td>Ship To</td>
                <td><%#XPath("shipaddress/address1")%></font></td>
                <td><%#XPath("shipaddress/city")%></td>
                <td><%#XPath("shipaddress/state")%>,
                    <%#XPath("shipaddress/zip")%></td>
              </tr>
            </table>
            <h3>Order Summary</h3>
            <asp:Repeater ID="Repeater2"
                 DataSource='<%#XPathSelect("summary/item")%>'
                 runat="server">
                <ItemTemplate>
                    <div>

                     <b><%#XPath("@dept")%></b> -
                         <%#XPath(".")%><asp:CheckBox ID="chkIncludeItem" runat="server" /><br />
                    </div>
                </ItemTemplate>
            </asp:Repeater>
            <hr />
        </ItemTemplate>
    </asp:Repeater>

    <asp:Button ID="btnGetSubmit" runat="server" OnClick="btnGetSubmit_Click" Text="Submit" />
  </form>
  </body>
</html>
    
risposta data 15.11.2012 - 19:39
fonte

Leggi altre domande sui tag