我在视图中使用EF对象作为模型。一些EF对象具有许多我不想在视图中显示它们的属性。所以我只创造了所需的属性' HTML控件。但是在MVC控制器映射时,EF将未使用的属性作为null写入表中的实际值。我怎样才能只使用已使用的属性(非空)?或者,如何仅在当前EF对象上映射非空属性?
编辑: 我认为检查非null属性可能是此问题的最佳实践。我怎样才能轻松完成这种映射?
答案 0 :(得分: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
}
答案 1 :(得分:0)
您可以手动或通过AutoMapper等工具将您的域/ EF模型映射到ViewModel,然后将您的视图字符串键入。在此映射期间,您可以对属性值执行必要的检查,以使它们准备好在View中显示。您还可以在ViewModel中创建执行空检查的只读属性,并公开值(如果存在)或空字符串(如果需要)。
答案 2 :(得分:0)
您可以拥有单独的ViewModel类(充当实际EF生成类的包装器),只包含您想要的属性。
或者可以使用Data Annotations
隐藏视图中的属性。为了实现这一点,您应该使用以下注释装饰要隐藏的属性。
[ScaffoldColumn(false)]
在您的情况下,第二个选项似乎很快且理想。
答案 3 :(得分: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)