c# - registro - Cómo llamar a TryUpdateModel fuera de un método de operación de datos
entity framework database first español (2)
Llamar a TryUpdateModel fuera de un método de acción que es una forma incorrecta de hacerlo. Debido a que Model Binder se combinó estrechamente con el método Action para que puedan rellenar automáticamente las propiedades del modelo con los datos que hayamos rellenado en la interfaz de usuario.
Entonces, intente TryUpdateModel dentro de un método de acción, espero que funcione bien.
- VS2012, .NET 4.51
Tengo un control de usuario que contiene un ListView
que utiliza el enlace del modelo. Hasta ahora tan bueno. Quiero mostrar una lista de objetos en función de cómo el usuario ha manipulado el modo de vista. Con este fin tengo una propiedad pública llamada Roles. Sin embargo, cuando llamo a TryUpdateModel()
desde allí, recibo la excepción:
TryUpdateModel ''debe recibir un proveedor de valores o, alternativamente, debe invocarse desde un método de operación de datos de un control que utiliza el enlace de modelo para el enlace de datos.
Ahora, si bien entiendo, puedo abandonar el modo de edición haciendo:
lvData.EditIndex = -1;
y luego en UpdateMethod
llamada TryUpdateModel()
, me preguntaba cómo podría llamar a TryUpdateModel
sin tener que conectar el método para realizar la actualización. Para decirlo de otra manera, cómo / dónde / qué debo suministrar para el parámetro TryUpdateModel()
a 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
debe recibir un proveedor de valores o, alternativamente, debe invocarse desde un método de operación de datos de un control que utiliza el enlace de modelo para el enlace de datos.
No hay una forma sencilla de obtener valores de los elementos de ListView. Tienes que hacer un bucle en los elementos y extraer sus valores.
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);
}
O fuerce el ListView para actualizar su propio elemento.
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);
}
Espero que esto ayude.