24

OK、現在のプロジェクトにもう 1 つ道の隆起があります。

マスター ページとコンテンツ ページの両方にフォーム要素があったことは一度もありません。関連するコンテンツにすべてのフォームがある傾向があります。

ただし、現在のプロジェクトでは、両方が必要なページがあります。右上にログインフォーム、コンテンツ内に質問フォームがあります。

これを取り込もうとしたところ、マスター ページに 1 つのフォーム要素が必要であるという ASP.NET の問題に遭遇しました。TBH、なぜこれが ASP.NET 側の要件なのかはよくわかりませんが、ちょっと。

マスターページとコンテンツページに独立して機能するフォーム要素を含めることができるかどうか、またはその方法を知っている人はいますか?

そうでない場合は、目的の外観/機能を実現する方法についてアドバイスをいただけますか?

4

12 に答える 12

19

私は私の未解決の質問のいくつかをレビューし、それらのいくつかを閉じることができるかどうかを確認すると思いました。

これは面白いものでした。ASP.NETページには1つのフォームしか持てないと私は完全に拒否しました。これは私には意味がありませんでした。Webページに複数のフォームがあるWebページをたくさん見ましたが、ASP.NETページが異なる必要があるのはなぜですか?

だから、考えさせられました。

ASP.NETページにフォーム要素が必要なのはなぜですか?

ASP.NETページは、PostBackモデルを通じて提供された状態の永続性によって、WinForms環境をエミュレートしようとします。これにより、状態の要素がステートレス環境に提供されます。これを行うには、ランタイムが各「フォーム」内でこの状態を維持できる必要があります。これは、データを自分自身にポストバックすることによって行われます。次の点に注意することが重要です。

  • PostBackについて本当に派手なものは何もありません。
  • 他のスタックからの他のフォームと同じように、HTTPフォームとPOSTを使用します。
  • 何か特別なことをしているように見えるからといって、そうではありません。発生するのは、POSTが原因に関する情報を返すだけなので、サーバー側のコードでクライアント側のイベントを処理するなどのことができます。

では、なぜ1つだけなのですか?

これは私にとって百万ポンドの質問でした(私はイギリス人です)。特にASP.NETサーバーコントロールを使用している場合、ASP.NETがこれを必要としていることは理解していますが、なぜ自分で追加のフォームを作成できないのでしょうか。

だから、私はそれをねじ込むと思った、ただあなた自身の形を作ってください!

そして、私はしました。送信アクションが「#」の、標準的でシンプルなフォームを追加しました。次に、リクエストに指定されたフォームのフォームデータを使用して、現在のページへのPOSTを実行します。

何だと思う?それはすべてうまくいきました。だから私は結局:

  • HTMLフォームを含むマスターページ
  • このフォームは、現在のページ(基本的にはマスターを使用しているページ)にポストバックします。
  • 次に、マスターのPage_Loadコードビハインドで、リクエストをチェックしてリクエストで渡されたデータを確認するコードを追加しました。データが含まれている場合(非表示フィールドなど)、投稿がマスターページのフォームから送信されたことがわかります。含まれていない場合は、コンテンツからのPostBackである可能性が高く、無視できます。
  • 次に、Contentタグを<form runat="server" id="aspNetForm"...> </form>タグで囲みました。これは、すべてのコンテンツページが自動的に操作するフォームを持っていることを意味しました。

これにより、問題に対する比較的単純でクリーンな解決策が得られました。私のログインフォームは、作成されたすべてのコンテンツフォームと連携して正常に機能します。その中には複雑なフォームもあれば、多くのサーバーコントロールや多くのPostBackを使用するものもあります。

これが他の人の役に立つことを願っています。

于 2008-10-27T16:54:59.310 に答える
5

フォーム タグ自体は MasterPage にあるため、必要なマスター ページに任意の asp.net サーバー コントロールをコーディングできます。また、これらのサーバー コントロールの処理ロジックは、マスター ページのコード ビハインド ファイルに記述できます。

したがって、あなたの例では、マスターページの右上にログインコントロールを配置し、コンテンツページではなくマスターページのコードページに認証ロジックを配置できます。

これにより、すべてのページにログイン コントロールを配置し、その処理を維持できるだけでなく、個々のページでコンテンツ コントロールとその処理を維持することもできます。

于 2008-10-07T13:28:29.800 に答える
4

他のすべての人は、特定のASP.NETページに含めることができるフォーム要素は1つだけであり、それはマスターページに含まれることになるとすでに述べています。ここまでは順調ですね。しかし、それはあなたがなりたい場所に完全に到達するのに役立つとは思いません...

マスターページでは、(私が思うに!)asp:ContentPlaceHolderコントロールを定義しました。マスターを使用するページには、対応するasp:Contentタグがあります。すべてのページコンテンツは、これらの対応するasp:Contentタグに入れる必要があります。

そのタグに入ると、それらはマスターページのフォームの一部になります。マスターページは独自のコントロールからのイベントに応答でき、ページ自体は独自のコントロールからのイベントに応答します。これで設定が完了しました。

マスターページを操作するためにページが必要な場合は、Page.Masterプロパティを介してアクセスできます。マスターページから公開されているコード(メソッド、プロパティなど)を操作するには、このプロパティを正しいタイプにキャストし、そこから公開されているコードにアクセスします。

これで、このシナリオで必要な場所にたどり着くはずです。(複数のサイトで機能しました!)

于 2008-10-07T13:49:43.470 に答える
4

ロブ、

興味深い解決策。私はあなたがしていることに何の問題も見ていません。ただし、一部の人が遭遇する可能性のある問題は、2つのサーバーフォームでこれを実行しようとした場合です。ASP.NETには、1つのページに複数のHTMLフォームを含めることはできないという規則はありません。ただ、ページに複数の「runat='server'」フォームを含めることはできません。明らかに、あなたはあなたのニーズを満たすための非常に簡単な方法を見つけました。

ASP.NETフレームワークは基本的にすべてを名前付けコンテナーで分離するため、ほとんどの場合、単一のフォームを処理することは問題ではないことがわかりました。しかし、最初の投稿コメントで、元の質問の本質には存在しなかったが重要な重要な要素にぶつかりました。重要な動作を入力してください。それは常にモンキーレンチを作品に投げ込みます。

標準の「すべてを網羅する」サーバーフォームを使用する場合、テキストボックスのテキスト変更イベントを使用して適切なアクションをキャプチャできませんでしたか?もちろん、ユーザーがどちらかを入力する前に両方の値を変更すると、奇妙な動作が発生します。また、Enterキーの主な問題は、HTMLフォームに複数の送信入力があると、テキストボックスでEnterキーを押しても何も起こらないことだと思います。INPUT要素が1つしかない場合にのみ、Enterキーを押すと「クリック」されます。

于 2008-10-27T17:17:51.073 に答える
3

以前の回答では、コード例はありませんでした。これを行う方法を示す Visual Studio 2012 Site.Master の簡易バージョンを次に示します。

<%@ 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>

したがって、単一の Form 要素ですべてがラップされているため、マスター ページにコントロールを配置できますが、コンテンツ ページでもコントロールを使用できます。

于 2013-01-12T17:24:23.370 に答える
2

ASP.NET ページで使用できるフォームは 1 つだけです。これを処理する 1 つの方法は、マスター ページのログイン ボタンにイベント ハンドラーを配置することです。ハンドラーはユーザーを検証し、成功すると同じページにリダイレクトします (イベント ハンドラーの前に実行される Page_Load ハンドラーを正しく実行するため)。

于 2008-10-07T13:26:24.860 に答える
0

軟膏!同様のスレッドで、私はあなたを助けるかもしれない答えを投稿しました。jqueryを使用して、空のdivにコンテンツを追加できます。そのコンテンツには、フォームタグを含めることができ、サーバー側のコードが実行していることとは無関係に送信機能を含めることもできます。これの唯一の欠点は、ユーザーがjavascriptを有効にしていない場合です。

同じ回答(およびコードも)を再投稿する代わりに、ここにリンクがあります:

asp.netWebフォームのJqueryAjax読み込みフォーム

于 2011-11-18T23:17:28.987 に答える
0

iframe をマスター ページに埋め込むことで、現在のプロジェクトの「ログイン サブフォームでリターン キーをクリックするとメイン フォームが送信される」問題を解決しました。iframe は、ユーザーを認証した login.aspx ページを指していました。

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

(何らかの理由で /iframe 終了タグが必要でした。そうしないと、デザイン ビューが混乱してしまいました)

于 2008-11-20T11:12:36.577 に答える
0

次の方法で aspx フォームから MasterPage コントロールにアクセス できます ID

たとえば、コントロールフォームを取得したい場合 = Master.FindControl("form")

コードでマスター ページのフォームを使用できるようになりました。

これが助けになることを願っています。

于 2010-11-07T12:52:53.470 に答える
-2

複数のフォームを持つことができます。(一度に表示できるのは 1 つだけです) コードライン 1 = フォーム 1 表示可能 / フォーム 2 非表示 . コード 2 フォーム 2 を表示 / フォーム 1 を非表示。= 解決済み (これは静的な連絡先フォームにも最適です

于 2010-03-31T10:20:38.197 に答える
-3

いいえ、ページごとに 1 つの asp.net フォームしか持てません。それは1.0からのルールです

両者は同じフォームを共有する必要があります

于 2008-10-07T13:21:35.057 に答える