Domanda

OK, un altro ostacolo nel mio attuale progetto.

Non ho mai avuto elementi del modulo in sia le mie pagine principale che quelle dei contenuti, tendo ad avere tutti i moduli nei contenuti laddove pertinenti.

Nel progetto attuale, tuttavia, abbiamo una pagina in cui vogliono entrambi. Un modulo di accesso in alto a destra e un modulo di domande nel contenuto.

Dopo aver provato a farlo, mi sono imbattuto nel problema del gemito ASP.NET sulla necessità di un singolo elemento modulo in una pagina master. TBH, non capisco perché questo sia un requisito da parte di ASP.NET, ma hey ho.

Qualcuno sa se / come posso fare in modo che le pagine principale e di contenuto contengano elementi del modulo che funzionano in modo indipendente?

In caso contrario, puoi offrire consigli su come procedere per ottenere l'aspetto / funzionalità desiderati?

È stato utile?

Soluzione

Ho pensato di rivedere alcune delle mie domande in sospeso e vedere se posso chiuderne alcune.

Questo è stato interessante. Ho assolutamente rifiutato di credere che puoi avere un solo modulo su una pagina ASP.NET. Questo per me non aveva senso. Ho visto molte pagine Web che hanno più di un modulo in una pagina Web, perché una pagina ASP.NET dovrebbe essere diversa?

Quindi, mi ha fatto pensare.

Perché una pagina ASP.NET necessita di un elemento modulo?

Le pagine ASP.NET tentano di emulare l'ambiente WinForms, fornendo la persistenza dello stato tramite il modello PostBack. Ciò fornisce un elemento di stato a un ambiente senza stato. Per fare ciò, il runtime deve essere in grado di avere la capacità di mantenere questo stato all'interno di ogni & Quot; form & Quot ;. Lo fa postando i dati su se stesso. È importante notare che:

  • Non c'è niente di veramente speciale in un PostBack.
  • Utilizza un modulo HTTP e un POST, uguale a qualsiasi altro modulo, da qualsiasi altro stack.
  • Solo perché sembra che stia facendo qualcosa di speciale, no, tutto ciò che accade è che POST è tornato con alcune informazioni su ciò che lo ha causato, quindi puoi fare cose come gestire eventi sul lato client, nel codice lato server .

Allora perché solo uno?

Questa per me era la domanda da un milione di sterline (sono inglese). Capisco che ASP.NET ne abbia bisogno, soprattutto se si utilizzano i controlli del server ASP.NET, ma perché diavolo non posso creare i miei moduli aggiuntivi?

Quindi, ho pensato di rovinare tutto, crea la tua forma!

E l'ho fatto. Ho aggiunto un semplice e semplice modulo standard con un'azione di invio di & Quot; # & Quot ;. Questo quindi esegue un POST alla pagina corrente, con i dati del modulo per il modulo indicato nella richiesta.

Indovina un po '? Tutto ha funzionato bene. Quindi ho finito con:

  • Una pagina principale, con un modulo HTML in
  • Questo modulo torna alla pagina corrente (sostanzialmente la pagina che utilizza il master).
  • Nel Page_Load code-behind per il master, ho quindi aggiunto il codice per controllare la richiesta per vedere quali dati sono stati passati nella richiesta. Se contiene dati (ad esempio un campo nascosto), so che il post è stato originato dal modulo nella pagina principale, in caso contrario, è più o meno un PostBack dal contenuto e può essere ignorato.
  • Ho quindi circondato i tag Content con <form runat="server" id="aspNetForm"...> </form> tag. Ciò significava che tutte le pagine di contenuti avevano automaticamente un modulo con cui lavorare.

Questo mi ha fornito una soluzione relativamente semplice e pulita al mio problema. Il mio modulo di accesso funziona bene insieme a tutti i moduli di contenuto creati, alcuni dei quali sono complessi, altri usano molti controlli del server e molti PostBack e così via.

Spero che questo aiuti gli altri.

Altri suggerimenti

il tag del modulo stesso si trova nella MasterPage, pertanto puoi codificare qualsiasi controllo del server asp.net sulla pagina principale che desideri. E puoi scrivere la logica di elaborazione per quei controlli del server sul codice della pagina master dietro il file.

Quindi, nel tuo esempio, puoi avere i controlli di accesso in alto a destra nella pagina principale e quindi avere la logica di autenticazione nella tabella codici per la PAGINA MASTER, non la tua pagina dei contenuti.

Ciò ti consente di avere i controlli di accesso su ogni pagina e di mantenere tale elaborazione, nonché di mantenere i controlli del contenuto e la loro elaborazione sulle loro singole pagine.

Tutti gli altri hanno già detto che è possibile avere un solo elemento modulo in una determinata pagina ASP.NET e che sarebbe contenuto nella pagina principale. Fin qui tutto bene. Ma non penso che ti aiuti ad arrivare pienamente dove vuoi essere ...

Nelle tue pagine mastro, hai (presumo!) definito asp:ContentPlaceHolder controlli. Le tue pagine che utilizzano il master hanno quindi i tag asp:Content corrispondenti. Tutto il contenuto della tua pagina deve contenere questi Page.Master tag corrispondenti

Una volta inseriti nel tag, fanno parte del modulo della pagina principale. La pagina principale può rispondere agli eventi dai propri controlli, e le pagine stesse rispondono agli eventi dai propri controlli, e tu sei pronto.

Se è necessario che la pagina interagisca con la pagina principale, è possibile accedervi tramite la proprietà <=>. Per interagire con qualsiasi codice visibile pubblicamente (metodi, proprietà, ecc.) Dalla pagina principale, devi trasmettere questa proprietà al tipo corretto e accedere al codice visibile pubblicamente da lì.

Questo dovrebbe portarti dove devi essere in questo scenario. (Ha funzionato per me su più siti!)

Rob,

Soluzione interessante. Non vedo alcun problema con quello che stai facendo. Il problema che alcuni possono riscontrare, tuttavia, è se provano a farlo con 2 moduli server. In ASP.NET non esiste alcuna regola secondo cui non è possibile avere più di 1 modulo HTML su una pagina, solo che non è possibile avere più di un & Quot; runat = 'server' & Quot; modulo sulla pagina. Ovviamente hai trovato un modo abbastanza semplice per soddisfare le tue esigenze.

Ho scoperto che, per la maggior parte, occuparsi di un singolo modulo non è un problema perché il framework ASP.NET sostanzialmente separa tutto per noi con i contenitori dei nomi. Ma nel tuo commento post iniziale hai centrato il fattore importante che era assente ma critico per l'essenza della domanda originale: inserire il comportamento chiave. Ciò getta sempre una chiave inglese nelle opere.

Se dovessi usare un " standard; tutto compreso " modulo server, non è possibile acquisire l'azione corretta utilizzando un evento di modifica del testo nella casella di testo? Naturalmente, se l'utente modificasse entrambi i valori prima di premere invio su uno di questi, si otterrebbero comportamenti strani. E penso che il problema principale con la chiave di invio sia che una volta che hai più di un input da inviare su un modulo HTML, premere INVIO in una casella di testo non fa nulla. Solo quando è presente un singolo elemento INPUT, il tasto Invio fa sì che uno sia & Quot; cliccato & Quot ;.

Nessuna delle risposte precedenti ha fornito un esempio di codice. Ecco una versione semplificata di Visual Studio 2012 Site.Master che illustra come eseguire questa operazione:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site - Copy.Master.cs" Inherits="WebApplication1.Site1Master" %>
<!DOCTYPE html>
<html>
    <head runat="server">
        <title>This is a title</title>
        <asp:ContentPlaceHolder runat="server" ID="HeadContent" />
    </head>
    <body>
    <form runat="server">
    <header>
        <div class="content-wrapper">
            <div class="float-right">
                <section id="login">
                    <asp:LoginView runat="server" ViewStateMode="Disabled">
                        <AnonymousTemplate>
                             <asp:ContentPlaceHolder runat="server" ID="AnonContent" />
                        </AnonymousTemplate>
                        <LoggedInTemplate>
                            <asp:ContentPlaceHolder runat="server" ID="LoggedInContent" />
                        </LoggedInTemplate>
                    </asp:LoginView>
                </section>
            </div>
        </div>
    </header>
        <div id="body">
        <asp:ContentPlaceHolder runat="server" ID="FeaturedContent" />
        <section class="content-wrapper main-content clear-fix">
            <asp:ContentPlaceHolder runat="server" ID="MainContent" />
        </section>
    </div>
    </form>
</body>
</html>

Quindi hai tutto racchiuso da un singolo elemento Form, in modo da poter posizionare i controlli nella pagina principale, ma anche le tue pagine di contenuto possono usare i controlli.

Puoi avere un solo modulo in una pagina ASP.NET. Un modo per gestirlo è inserire un gestore eventi sul pulsante di accesso nella pagina principale. Il gestore convaliderà l'utente e reindirizzerà alla stessa pagina in caso di successo (per eseguire correttamente il gestore Page_Load, che viene eseguito prima dei gestori di eventi).

Ho risolto il " facendo clic sulla chiave di ritorno nel sottomodulo di login, il modulo principale invia " problema nel mio progetto attuale incorporando un iframe nella pagina principale. L'iframe puntava alla pagina login.aspx che autenticava l'utente.

<iframe id="login" src="login.aspx" frameborder="0" enableviewstate="false" scrolling="no" runat="server"></iframe>

(per qualche motivo avevo bisogno del tag di chiusura / iframe, altrimenti la vista del design era confusa)

Puoi accedere ai controlli MasterPage dal modulo aspx: aggiungi il tag detrattivo al modulo aspx <% @ MasterType VirtualPath = " ~ / Site.Master% > e nel codice dietro usa Master.FindControl (); per ottenere il controllo tramite ID

per esempio se vuoi ottenere il   Control form = Master.FindControl (" form ")

ora puoi utilizzare il modulo della pagina principale nel tuo codice.

Spero che questo aiuto.

Salve! In una discussione simile, ho pubblicato una risposta che potrebbe aiutarti. Puoi usare jquery per aggiungere contenuti a un div vuoto. Tale contenuto può includere tag del modulo e persino una funzione di invio indipendentemente da qualsiasi cosa il codice sul lato server stia facendo. L'unico aspetto negativo di questo è se l'utente non ha JavaScript abilitato!

Invece di ripubblicare la stessa risposta (e anche il codice), ecco il link:

Modulo di caricamento Jquery Ajax su asp.net webform

Questa è una limitazione di ASP.NET

ASP.NET è progettato per avere un modulo per pagina e un solo modulo. Quando è stato originariamente progettato, non era un problema.

Tuttavia da allora questo è stato identificato come un grosso problema di accessibilità.

Microsoft Fix per questo era ASP.NET MVC, se puoi suggerirei di passare a ASP.NET MVC poiché risolve un gran numero di problemi con ASP.NET

Puoi avere più di 1 modulo. (solo 1 visibile alla volta) codeline 1 = modulo 1 visibile / modulo 2 nascosto. Codice 2 Modulo 2 visibile / modulo 1 nascosto. = risolto (è ottimo anche per i moduli di contatto statici

no, puoi avere solo un modulo asp.net per pagina. Questa è la regola da 1.0

Dovrebbero entrambi condividere lo stesso modulo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top