我有一个带有视图的模型,可以让用户编辑某些属性。但是,我不希望从视图中访问几个属性,因此我不能将所有内容转储到隐藏字段中以进行回发。
我确定这是一种常见的情况,那么是否有一种简单的方法只回发视图中的更改,以便存储在数据库中的属性不会被空值或默认值覆盖?
我知道我可以在调用编辑视图时将模型存储在Session变量中,然后在回发表单时检查更改,但这有点像hacky?
答案 0 :(得分:4)
不使用域模型对象发送到视图,而是使用单独的视图模型,该模型仅包含要向用户显示的属性。回发视图模型时,检索域模型并从视图模型更新其属性。
答案 1 :(得分:0)
我发现这个实用程序可以方便地将viewmodel复制到域模型。我发现这是在互联网上的其他地方,而不是我的代码...有些警告,因为反射可能会有点慢。但它对我来说工作得很快。它比自动播放器轻得多。
以下是将视图模型复制到域的代码:
UtilityService.CopyValues(realPropertyViewModel, realProperty);
以下是实用程序服务方法:
public static void CopyValues<TSource, TTarget>(TSource source, TTarget target)
{
var sourceProperties = typeof(TSource).GetProperties().Where(p => p.CanRead);
foreach (var property in sourceProperties)
{
var targetProperty = typeof(TTarget).GetProperty(property.Name);
if (targetProperty != null && targetProperty.CanWrite && targetProperty.PropertyType.IsAssignableFrom(property.PropertyType))
{
var value = property.GetValue(source, null);
targetProperty.SetValue(target, value, null);
}
}
}