Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Web Forms Model Binding: How to omit binding for not visible control?

Tags:

I am using the new Model Binding feature for WebForms, with .NET Framework Version 4.5.1. What I hope to achieve is, to exclude some of the two-way bindings, based on some condtions.

I very much like the (hopefully now famous) blog post series, by Scott Guthrie. I implement an editing page using the approach number two from Web Forms Model Binding Part 3: Updating and Validation (ASP.NET 4.5 Series)

Here's what I have: (simplified, in ElementEdit.aspx):

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

As you see, there is a condition for the visibility on the wrapped inner panel with "more databound controls". These should bind only, when the conditioni is true, and they are visible. Otherwise they should not bind and not change the values.

The update works like in Scott's post (simplified, in xxPage.cs), which is a generic base class of Type Element:

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;
}

Here, after the call to TryUpdateModel(), the invisible controls have updated the model, which is what I wanted to avoid.

How to dynamically omit data binding for some elements, based on a condition, even though setting them invisible does not help?

UPDATE: I now have create a workaround, which solves the problem for me today: I simply have created two .aspx pages with their respective code behind. Depending on which fields the user should successfully edit, I call the appropriate page in the first place.

This, however, does not solve the underlying problem, which is conditional databinding.