How to call TryUpdateModel outside a data operation method

  • VS2012, .NET 4.51

I have a user control that contains a ListView that is using model binding. So far so good. I want to display a list of objects based on how the user has manipulated the view mode. To this end I have a public property called Roles. However when I call TryUpdateModel() from inside there, I receive the exception:

TryUpdateModel' must be passed a value provider or alternatively must be invoked from inside a data-operation method of a control that uses model binding for data binding

Now while I understand I can drop out of edit mode by doing:

lvData.EditIndex = -1;

and then in the UpdateMethod call TryUpdateModel(), I was wondering how I could call TryUpdateModel without having to wire up the method to do the update. To put it another way how/where/what do I supply for the IValueProvider parameter to TryUpdateModel().

/// <summary>
///     Initialise the user control
/// </summary>
/// <param name="aRoles">List of roles to display</param>
public void Activate(List<RoleInfo> aRoles)
{
    //List we will be binding
    _ViewModel = new List<MembershipRolesViewModel>();

    //Transfer the supplied list into the view model
    foreach (RoleInfo roleInfo in aRoles)
    {
        _ViewModel.Add(new MembershipRolesViewModel
        {
            RoleDisplayName = roleInfo.RoleDisplayName,
            RoleHint = roleInfo.RoleHint,
            RoleName = roleInfo.RoleName,
            RoleSelected = roleInfo.RoleSelected
        });
    }
}

//ListView.SelectMethod points here
public IQueryable<MembershipRolesViewModel> RolesSelect()
{
    return _ViewModel.AsQueryable();
}

//Property to return the roles as manipulated by the user
public List<RoleInfo> Roles
{
    get
    {
        List<RoleInfo> result = new List<RoleInfo>();
        TryUpdateModel(_ViewModel);

        foreach (MembershipRolesViewModel membershipRolesViewModel in _ViewModel)
        {
            result.Add(new RoleInfo
            {
                RoleDisplayName = membershipRolesViewModel.RoleDisplayName,
                RoleHint = membershipRolesViewModel.RoleHint,
                RoleName = membershipRolesViewModel.RoleName,
                RoleSelected = membershipRolesViewModel.RoleSelected
            });
        }

        return result;
    }
}

TryUpdateModel must be passed a value provider or alternatively must be invoked from inside a data-operation method of a control that uses model binding for data binding.

Answers


There's no simple way to get values from ListView items. You have to loop on items and extract their values.

var bindableTemplate = lv.ItemTemplate as IBindableTemplate;
foreach (ListViewItem item in lv.Items)
{
    var dic = bindableTemplate.ExtractValues(item).Cast<System.Collections.DictionaryEntry>().ToDictionary(k => (string)k.Key, v => v.Value);
    var provider = new DictionaryValueProvider<object>(dic, System.Globalization.CultureInfo.InvariantCulture);

    // Now we can update the item.
    TryUpdateModel<RoleInfo>(model, provider);
}

Or force the ListView to update own item.

public List<RoleInfo> Roles
{
    get
    {
        List<RoleInfo> result = new List<RoleInfo>();
        for (int i = 0; i < lv.Items.Count; i++)
            if (lv.Items[i].ItemType == ListViewItemType.DataItem)
                lv.UpdateItem(i, true);

        //...

        return result;
    }
}



public void lv_UpdateItem(int id)
{
    RoleInfo model = //...
    TryUpdateModel(model);
}

Hope this helps.


Calling TryUpdateModel outside an Action method that is wrong way to do. Because Model Binder tightly coupled with the Action method so that they can auto populate to model properties with data whatever we have filled on the UI.

So, please try to TryUpdateModel within an action method,I hope that will work fine.


Need Your Help

How to ignore `node_modules` folder during TypeScript build in VSCode

typescript visual-studio-code

I'm using visual studio code IDE and typescript, how do I get it to ignore the node_modules folder during build? Or have it build .ts files on save? It is showing a lot of errors because it's try...

docker build + private NPM (+ private docker hub)

node.js docker npm docker-registry npm-private-modules

I have an application which runs in a Docker container. It requires some private modules from the company's private NPM registry (Sinopia), and accessing these requires user authentication. The