6

オブジェクトがあるとしましょう

class Entity
{
    public string ID {get; set;}
    public string Name {get; set;}
}

次のようなページの2つのテキストボックスにプロパティをバインドしたいと思います。

<asp:FormView ID="FormView" runat="server">
  <ItemTemplate>
    <asp:textbox ID="TextId" Text='<%# Bind("ID") %>'/>
    <asp:textbox ID="TextId" Text='<%# Bind("Name") %>'/>
  </ItemTemplate>
</asp:FormView>

次に、これをコードビハインドで記述します

public EntityObject
{
    get { return ViewState["Entity"] as Entity; }
    set { ViewState["Entity"] = value; }
}

protected override void OnInit(EventArgs e)
{
    if (EntityObject== null)
        EntityObject= new EntityObject();

    FormView.DataSource = new[] { EntityObject };
    FormView.DataBind();
    base.OnInit(e);
}

また、テキストボックスに値を入力すると、PostBack後にページがリロードされたときに、EntityObjectのプロパティにこれらの値が含まれると思いますが、プロパティは常にnullです。

4

5 に答える 5

7

残念ながら、ASP.NETは.netオブジェクトへの双方向バインディングをサポートしていません...代わりに、すべてのポストバックで「手動バインディング」のようなものを使用できます(ここではAddIncomeSourcesはRepeaterControlです)

public List<Income> AdditionalIncomeList 
{
    get { return ViewState["AdditionalIncome"] as List<Income>; }
    set { ViewState["AdditionalIncome"] = value; }
} 

foreach (RepeaterItem item in AddIncomeSources.Items)
{
    var amount = (TextBox)item.Controls.Cast<Control>().First(c => c.ID == "Amount");
    var document = (DropDownList)item.Controls.Cast<Control>().First(c => c.ID == "Document");
    AdditionalIncomeList[item.ItemIndex].Amount = amount.Text.ToDouble();
    AdditionalIncomeList[item.ItemIndex].IncomeDocument = document.SelectedValue;
}

AddIncomeSources.DataSource = AdditionalIncomeList;
AddIncomeSources.DataBind();
于 2011-09-16T10:06:48.503 に答える
0

ここでの問題は、動的制御を作成しようとしていることです。

.aspxページでgridviewコントロールを使用してデータをバインドできます。デフォルトでは、自分の代わりにビューステートがあります。

とにかくWebはステートレスなので、ViewState、Session、またはApplicationを介してデータを保持する必要があります。また、キャッシュに保持することはできますが、信頼性はありません(実用的に信頼できるものにすることができます)。ほとんどの.NETコントロールには、ViewStateが組み込まれています。

于 2011-09-21T08:20:00.760 に答える
0

OnInitでは、常にnullを作成しています。これらのコードを削除してページの読み込みを続けてください。

すべてのポストバックではなく、最初にバインドする必要があるだけです。

Page_Load(){

if(!Page.IsPostBack)
{
     if (EntityObject== null) 
            EntityObject= new EntityObject(); 

        FormView.DataSource = new[] { EntityObject }; 
        FormView.DataBind(); 
 }

}

于 2011-09-15T10:21:53.863 に答える
0

探している人のために、私はこのjavascriptプラグインを作成しました。WPFのデータバインディングに非常に近いデータバインディングを実行し、使いやすいです。.txtファイルにドキュメントが添付されています

https://github.com/jdemeuse1204/ObjectDataBinding

これが私のバインディングの1つがどのように見えるかの例です

<input runat="server" class="popoutEditInput" style="width: 50px;" data-bind="path: Quote" />

アクティベートするには

$("#yourelementname").observe(yourobject, 'yourbindingname');

保存またはその他の操作のためにオブジェクトを元に戻すには

var object = $("#yourelementname").getObserveObject('yourbindingname');
于 2014-08-06T19:19:31.757 に答える
0

このためのソリューションを作成しました。

https://www.codeproject.com/Articles/146078/WPF-Two-way-Databinding-in-ASP-NET-Enabling-MVVM

またはgithub:

https://github.com/Recodify/mvvm-4-asp-webforms

于 2017-09-14T09:42:16.497 に答える