如何在不覆盖旧信息的情况下发布部分填写的表格?

时间:2015-03-16 19:40:16

标签: c# asp.net-mvc entity-framework

我有一个带有视图的模型,可以让用户编辑某些属性。但是,我不希望从视图中访问几个属性,因此我不能将所有内容转储到隐藏字段中以进行回发。

我确定这是一种常见的情况,那么是否有一种简单的方法只回发视图中的更改,以便存储在数据库中的属性不会被空值或默认值覆盖?

我知道我可以在调用编辑视图时将模型存储在Session变量中,然后在回发表单时检查更改,但这有点像hacky?

2 个答案:

答案 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);
            }
        }
    }