The*_*dge 20 c# asp.net webforms model-binding
我有一个用户控件,其中包含ListView使用模型绑定的用户控件.到现在为止还挺好.我想根据用户操作视图模式的方式显示对象列表.为此,我有一个名为Roles的公共财产.但是,当我TryUpdateModel()从里面打电话时,我收到了异常:
TryUpdateModel'必须传递给值提供者,或者必须从使用模型绑定进行数据绑定的控件的数据操作方法内部调用
现在,虽然我明白我可以通过执行以下操作退出编辑模式:
lvData.EditIndex = -1;
Run Code Online (Sandbox Code Playgroud)
然后在UpdateMethod通话中TryUpdateModel(),我想知道如何TryUpdateModel在不必连接方法进行更新的情况下调用.换句话说,如何/在哪里/我为IValueProvider参数提供什么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;
}
}
Run Code Online (Sandbox Code Playgroud)
TryUpdateModel 必须传递值提供程序,或者必须从使用模型绑定进行数据绑定的控件的数据操作方法内部调用.
没有简单的方法可以从 ListView 项目中获取值。您必须循环项目并提取它们的值。
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);
}
Run Code Online (Sandbox Code Playgroud)
或者强制 ListView 更新自己的项目。
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);
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
1997 次 |
| 最近记录: |