1

同様に構造化されたFormViewがいくつかあります。マークアップの重複を避けるために、FormViewを含むマスターページを作成し、FormView内にContentPlaceHolderを配置しました。特定のデータバインドされたコントロール(ページごとに変更される唯一のもの)は、そのマスターページを使用するページにあります。

だから私はこのようなマスターページを持っています:

<%@ master ... %>
...
<form runat=server>
...
   <asp:formview runat="server" ... >
      <edititemtemplate>
         ... Lots of common markup ...
         <asp:contentplaceholder id='FormRows' runat='server' />
         ... Lots more common markup ...
       </edititemtemplate>
    </asp:formview>
...
</form>

そして、次のようなマスターページを使用するページ:

<%@ page masterpagefile="Form.Master" ... %>
<asp:content contentplaceholderid="FormRows" runat="server" >
   ...
   <p>
     Field One: 
     <asp:textbox runat=server text='<%#Bind("Field1")%>' id='Field1' />
   </p>
   <p>
     Field Two: 
     <asp:textbox runat=server text='<%#Bind("Field2")%>' id='Field2' />
   </p>
   ...
</asp:content>

既存のレコードを使用すると、FormViewはデータバインドされたコントロール(Field1など)を確認し、正しいデータを入力します。ただし、挿入または更新する場合、それらは表示されず、挿入または更新には含まれません。FormView_ItemInsertingイベントでは、はe.Values空です。同様に、FormView_ItemUpdatingイベントでe.NewValuesは、空です。

それで:

  1. マスターページでFormViewを起動して、ContentPlaceholder内のデータバインドされたコントロールを確認する方法はありますか?

  2. <%#Bind(...)%>それができない場合、値バッグに手動で追加できるように、データバインドされているコントロールを識別する簡単な方法はありますか?

4

5 に答える 5

2

この設定が機能せず、マークアップよりも多くのコードが表示される可能性がある理由がいくつか頭に浮かびます。

マスターページで定義されたデータソースがある場合、クエリなどを変更するロジックをマスターページに追加しない限り、各ページからの異なるデータバインドコントロールを処理しません。

すべてのフォームビューが結合され、今後の変更の複雑さが増します

FormViewごとに個別のページを使用して、コード、デバッグ、および変更機能の複雑さを軽減します。

ちょうど私の2セント

于 2009-04-30T14:33:25.217 に答える
0

不可能ではあるが、これは難しいと思う。実際、データバインディングがまったく機能することに驚いています。

FormViewコントロールをカプセル化する別の方法を試してみることをお勧めします。

現在ContentPlaceHolderがあるPlaceHolderを使用して、FormViewコントロールを.ascxコントロールに配置してみることができます。

次に、各ASPXページに、プレースホルダーのフィラーを含むミラーASCXページを作成できます。それらに同じ名前を付けるか(Page1.aspxはPage1.ascxを使用します)、Page1-Content.ascxのような命名規則を設定して、FormView ascxがフィラーコントロールの名前を理解できるようにすることができます。Pag​​e.LoadControl()を使用してください。パスによってコントロールをロードし、初期化フェーズ中にそのコンテンツをプラグインします。

これで、コンテンツコントロールにはパブリックプロパティを設定できるという利点があるため、これらのパブリックプロパティにバインドし、フィラー.ascxファイル内の適切なサーバーコントロールとの間でデータをシャトルすることができます。

残念ながら、ファイルは2倍になりますが(各ページにASPXとASCXが必要なため)、他の方法(すべてのコードを複製する)と比較すると、かなりの作業が必要になります。

もちろん、すべての一般的なマークアップが何であるかを教えてくれませんでしたが、一般的なマークアップはCommonMarkupHeader.ascxとCommonMarkupFooter.ascxにも入り、各ページの一意のFormViewに含まれる可能性があります。

于 2009-05-05T04:35:11.807 に答える
0

サーバーフォームタグはどこにありますか?マスターページの代わりにコンテンツプレースホルダーにある可能性があるため、送信後に値がサーバーページに送信されない

于 2009-04-26T23:58:29.370 に答える
0

あなたはこのようなことをすることができるかもしれません...

バインド可能なデータソースを返すメソッドシグネチャを持つ「データページ」のインターフェイスを定義します。

public interface IFormViewChild {
   IEnumerable GetFormData();
}

次に、「データページ」にそのインターフェイスを実装させることができます...

public class ChildDataPage : Page, IDataPage {
   public IEnumerable GetFormData() {
      // code to return stuff here
   }
}

最後に、マスターページのLoad()イベントで...

if (Page is IFormViewChild) {
   myFormViewControl.DataSource = ((IFormViewChild)Page).GetFormData();
   myFormViewControl.DataBind();
}

これはすべて、このWebフォームエディタに直接入力された疑似コードであることに注意してください。おそらく間違っています。しかし、そうではないかもしれません:)

于 2009-05-01T00:55:15.563 に答える
0

これが暫定的な解決策です-エレガントではありませんが、機能します。Form.Masterのコードビハインドには、次のようなものがあります。

    Private Sub FormView1_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewInsertEventArgs) Handles FormView1.ItemInserting
        ManuallyAddValues(e.Values)
    End Sub

    Private Sub FormView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewUpdateEventArgs) Handles FormView1.ItemUpdating
        ManuallyAddValues(e.NewValues)
    End Sub

    Private Sub ManuallyAddValues(ByRef Values As IOrderedDictionary)
        For Each Field As Core.Field In FormView1.DataSourceControl.IncludedFields
            If Values(Field.Name) Is Nothing Then
                Dim DataboundControl As Control = FormView1.FindControl("FormRows").FindControl(Field.Name)
                Values.Add(Field.Name, GetValue(DataboundControl))
            End If
        Next
    End Sub

これはそれほどエレガントではありません

  1. すべてのデータバインドされたコントロールの名前を知っている必要があります
  2. これは、各コントロールのIDがフィールド名と一致するという仮定に依存しています
  3. 'GetValue'関数(ここには含まれていません)は不器用なソリューションです。さまざまなタイプ(テキストボックス、ドロップダウンリスト、チェックボックスなど)をチェックし、適切なプロパティ(textbox.text、dropdownlist.selectedvalue、チェックボックスなど)から文字列値を取得します。チェックなど)。

少なくとも、「<%#Bind( "Foo")%>」構文で何がバインドされているかを知り、その情報を直接取得する方法が欲しいです。

于 2009-05-05T15:01:13.563 に答える