首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Web窗体模型绑定:如何忽略不可见控件的绑定?

Web窗体模型绑定:如何忽略不可见控件的绑定?
EN

Stack Overflow用户
提问于 2015-08-06 15:49:24
回答 1查看 1.6K关注 0票数 19

我在.NET框架4.5.1版中使用了WebForms的新模型绑定特性。基于一些条件,我希望实现的是,排除一些双向绑定的

我非常喜欢(希望现在很有名) blog post series, by Scott Guthrie。我使用Web Forms Model Binding Part 3: Updating and Validation (ASP.NET 4.5 Series)中的第二种方法实现了一个编辑页面

下面是我所拥有的:(简化,在ElementEdit.aspx中):

代码语言:javascript
复制
<asp:FormView runat="server" ID="FormViewElement" RenderOuterTable="false" DefaultMode="Edit" DataKeyNames="ElementId"
    ItemType="Business.Entities.Element"
    SelectMethod="GetElement"
    UpdateMethod="UpdateElement">
    <EditItemTemplate>
        <asp:Panel runat="server" DefaultButton="ButtonSpeichern">
            <fieldset>
                /*some databound controls*/
                <asp:Panel runat="server" Visible="<%# !Item.CurrentElementData.SomeCondition() %>">
                    /*more databound controls*/
                </asp:Panel>
                /*the submit button ("ButtonSpeichern")*/
            </fieldset>
        </asp:Panel>
    </EditItemTemplate>
</asp:FormView>

正如您所看到的,在带有“更多数据绑定控件”的包装内侧面板上有一个可见性条件。只有当conditioni为true,并且它们是可见的时,才应该绑定它们。否则,它们不应该绑定,也不应该更改值。

更新的工作原理类似于Scott的帖子(简化,在xxPage.cs中),它是一个类型元素的泛型基类:

代码语言:javascript
复制
protected virtual bool UpdateEntity(int id) {
    T existing = UseCase.GetItem(id); //gets the original element    

    TryUpdateModel(existing); //SHOULD NOT update the invisible databound controls, but does

    ValidateExistingEntity(existing);    
    if (ModelState.IsValid) {
        UseCase.Update(existing);
        return true;
    }
    ShowErrors(ModelState);
    return false;
}

在这里,在调用TryUpdateModel()之后,不可见的控件已经更新了模型,这是我想要避免的。

如何根据条件动态省略某些元素的数据绑定,即使将它们设置为不可见也无济于事?

更新:我现在已经创建了一个变通方法,它为我解决了今天的问题:我简单地创建了两个.aspx页面,它们各自的代码隐藏在后面。根据用户应该成功编辑的字段,我首先调用适当的页面。

但是,这并没有解决潜在的问题,即条件数据绑定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-11 04:10:30

这与其说是一种编码解决方案,不如说是一种算法。

我喜欢使用一个单独的类,比如MyData.cs来管理我的数据更新,并通过这个类的方法传递UI元素。我就像存储过程,但您可以在项目中创建查询。

如果哪些控件是可见的,哪些控件是不可见的,我建议您:

代码语言:javascript
复制
MyBindingMethod(array[] of the controls){
    // Loop through array updating data.
    // Or loop through array and call a second method to update the data.
}

动态地,您可以检查控件的可见性,然后将它们添加到数组中,或者不传递给绑定方法。

如果切换可见性的控件是恒定的,则可以使用两种单独的方法有选择地进行更新:

代码语言:javascript
复制
MyBindingMethodAll(){
    // Update all controls.

}

MyBindingMethodVisible(){
    // Update controls that remain visible.

}

然后从您的aspx.cs调用MyData.cs中的方法。诀窍是在C#中保持对数据绑定的控制,这样您就可以准确地确定更新的内容、地点和时间。

如果你能提供更多的代码,我很乐意提供一个更详细的工作示例。

帮助澄清solution的编辑更新

通过使用单独的类来管理数据绑定,可以将显示元素传递给此单独类的方法。我使用过存储过程。

ManageData类

代码语言:javascript
复制
public static void SelectAllSomething(DropDownList list)
    {
        // Clear any previously bound items.
        list.Items.Clear(); 
        // SqlConnection.
        SqlConnection con = new SqlConnection(conString);
        // Create new command and parameterise.
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "MyStoredProcedure";

        cmd.Connection = con;
        try
        {
            // Open connection and bind data to GUI.
            con.Open();

            list.DataSource = cmd.ExecuteReader();
            list.DataTextField = "Name";
            list.DataValueField = "ID";
            list.DataBind();

        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            con.Close();
            con.Dispose();
        }
    }

从aspx.cs调用ManageData类中的方法。

代码语言:javascript
复制
ManageData.SelectAllCat(MyDropDownList);

使用相同的原则。

如果看不到你的布局,我只能给你一个概念示例。

如果你有你想要控制的TextBoxes,

TextBox1、TextBox2、TextBox3、.../

代码语言:javascript
复制
public static void AddText(List<TextBox> MyTextBoxes)
{
    for(int i=0; i<MyTextBoxes.Count();i++){
        MyTextBoxes.[i].Text = // What means you are using.
    }

}

从aspx.cs

代码语言:javascript
复制
public List<TextBox> FindVisibleTextBoxes(){

    List<TextBox> MyTextBoxes = new List<TextBox>();
    if(TextBox1.Visible== true){
        MyTextBoxes.Add(TextBox1);
    }

    return MyTextBoxes;

}

将textbox list从ManageData传递到方法。

这可以根据您的需要更好地模块化,并且您可以传递多个列表or a List of Objects来传递异类混合的控件。

这只是一个概念,有很多方法去做事情。我希望你发现这对开发更多的方法来解决你的困境很有用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31849843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档