2014-03-27 42 views
0

我在视图中使用EF对象作为模型。一些EF对象具有许多我不想在视图中显示的属性。所以我只创建了需要的属性的html控件。但是,当MVC控制器映射时,EF将未使用的属性作为null写入表中的实际值。我怎样才能写只使用过的属性(非空)?或者我怎么才能映射只有非空属性在当前的EF对象?如何处理未在MVC视图中使用的空属性?

编辑: 我想检查不空的属性,可能是这个问题的最佳实践。我怎样才能轻松完成这个映射?

+0

属性你问如何只更新在视图中使用的属性?你也可以发布代码 – ElectricRouge

+0

是的,我需要更新只使用的。我没有关于此的代码,只是在研究。 – Baran

回答

1
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 
} 
+0

请不要在没有解释我们正在查看的内容的情况下提供代码转储。 – Andrew

0

,你可以手动或通过类似AutoMapper工具,您的域名/ EF模型映射到视图模型中,然后你stringly键入您的意见来。在此映射过程中,您可以对属性值执行必要的检查,以使其准备在视图中显示。您也可以在您的ViewModel中创建只读属性,进行空检查,并在需要时显示值(如果存在)或空字符串(例如,如果需要)。

0

您可以拥有单独的ViewModel类(充当实际EF生成的类的包装),它只包含所需的属性。

或者可以使用Data Annotations隐藏视图中的一个属性。为了做到这一点,你应该装饰你想隐藏的财产与以下注释。

[ScaffoldColumn(false)] 

第二个选项似乎是快速和理想的在你的情况。

+0

我没有使用Code First。另外一些道具可能用于另一种观点。所以改变模型对我来说不是一个解决方案。 – Baran

+0

需要为每个模型分别编写不同的模型。这是浪费时间。 – Baran

+0

在这种情况下,您剩下的唯一选项是为每个视图设置一个中间人(视图模型)。而这个单独的视图模型可以自定义属性。 – Nair

0

可能是这样的。

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) 
+0

隐藏的fiels可能会被用户修改。我不想使用隐藏。 – Baran

+0

@Baran你只能在EF中更新你想要的字段。查看第一个片段。 – ElectricRouge

+0

//你需要更新的所有领域 这项工作必须手工完成。它必须是自动的。 – Baran

相关问题