C# 如何处理MVC视图中未使用的空属性?

C# 如何处理MVC视图中未使用的空属性?,c#,asp.net-mvc,entity-framework,razor,C#,Asp.net Mvc,Entity Framework,Razor,我使用EF对象作为视图中的模型。一些EF对象有很多我不想在视图中显示的属性。所以我只创建所需属性的html控件。但在MVC控制器映射时,EF将未使用的属性作为null写入表中的实际值。如何仅写入已用属性(非空)?或者如何在当前EF对象上仅映射NOTNULL属性 编辑: 我认为检查NOTNULL属性可能是解决此问题的最佳实践。如何轻松地进行映射?您可以手动或通过AutoMapper之类的工具,将域/EF模型映射到ViewModel,然后严格键入视图。在此映射过程中,可以对特性值执行必要的检查,以准

我使用EF对象作为视图中的模型。一些EF对象有很多我不想在视图中显示的属性。所以我只创建所需属性的html控件。但在MVC控制器映射时,EF将未使用的属性作为null写入表中的实际值。如何仅写入已用属性(非空)?或者如何在当前EF对象上仅映射NOTNULL属性

编辑:
我认为检查NOTNULL属性可能是解决此问题的最佳实践。如何轻松地进行映射?

您可以手动或通过AutoMapper之类的工具,将域/EF模型映射到ViewModel,然后严格键入视图。在此映射过程中,可以对特性值执行必要的检查,以准备在视图中显示它们。您还可以在ViewModel中创建只读属性,这些属性执行空检查,并公开值(如果存在)或空字符串(如果需要)

您可以拥有单独的ViewModel类(充当实际EF生成类的包装器),这些类只包含您想要的属性

或者可以使用
数据注释
从视图中隐藏特性。为了实现这一点,您应该用下面的注释装饰要隐藏的属性

[ScaffoldColumn(false)] 

第二种选择在您的情况下似乎是快速而理想的。

可能是这样的

public ActionResult UpdateTable(Table t)
{
    var up = _dbContext.Table.Find(t.ID);  //t.ID is  Primary Key
    up.Name = t.Name;
    // All the fields you need to update
    _dbContext.Entry(Table).State = EntityState.Modified;
    _dbContext.SaveChanges();
     return View(up);

}
还可以为类似这样的属性创建隐藏字段

@Html.HiddenFor(model => model.Name)
public void自动映射(MappingMod\u MappingMod,object\u Destination,object\u Resource)
{
类型resourceType=_Resource.GetType();
IList props=resourceType.GetProperties();
if(_-MappingMod==MappingMod.allProperties和noteNumerableProperties | | | u-MappingMod==MappingMod.notNullProperties和noteNumerableProperties)
{
props=props.Where(m=>m.getMethod().IsVirtual!=true.ToList();
}
类型destinationType=_Destination.GetType();
foreach(PropertyInfo props in props)
{
PropertyInfo destinationProp=destinationType.GetProperty(prop.Name);
if(destinationProp!=null)
{
if(自动映射控制器(_MappingMod,_Destination,_Resource,prop))
{
destinationProp.SetValue(_Destination,prop.GetValue(_Resource,null));
}
}
}
}
公共枚举映射模块
{
所有财产,
不为空属性,
AllProperties和NoteNumerableProperties,
NotNullProperties和NoteNumerableProperties
}

您是否在询问如何仅更新视图中使用的属性?你也可以发布代码吗?是的,我只需要更新用过的代码。我没有这方面的代码,只是研究。我不是先用代码。一些道具可能会用在另一个视图上。所以改变模型对我来说不是一个解决方案。需要为每个模型编写单独的模型。这是浪费时间。在这种情况下,您剩下的唯一选择是为每个视图指定一个中间人(viewmodel)。这个独立的视图模型可以自定义属性。隐藏区域可以由用户修改。我不想使用hiddens。@Baran您只能更新EF中需要的字段。请参阅第一个代码段//更新此作业所需的所有字段都必须手动完成。它必须是自动的。请不要只是给出一个代码转储,而不解释我们在看什么。
public void AutoMapping(MappingMod _MappingMod, object _Destination, object _Resource)
    {
        Type resourceType = _Resource.GetType();

        IList<PropertyInfo> props = resourceType.GetProperties();

        if (_MappingMod == MappingMod.AllPropertiesAndNotEnumerableProperties || _MappingMod == MappingMod.NotNullPropertiesAndNotEnumerableProperties)
        {
            props = props.Where(m => m.GetGetMethod().IsVirtual != true).ToList();
        }

        Type destinationType = _Destination.GetType();

        foreach (PropertyInfo prop in props)
        {
            PropertyInfo destinationProp = destinationType.GetProperty(prop.Name);

            if (destinationProp != null)
            {
                if (AutoMappingController(_MappingMod, _Destination, _Resource, prop))
                {
                    destinationProp.SetValue(_Destination, prop.GetValue(_Resource, null));
                }
            }
        }
    }


public enum MappingMod
{
AllProperties,
NotNullProperties,
AllPropertiesAndNotEnumerableProperties,
NotNullPropertiesAndNotEnumerableProperties
}