我在视图中使用EF对象作为模型。一些EF对象具有许多我不想在视图中显示的属性。所以我只创建了需要的属性的html控件。但是,当MVC控制器映射时,EF将未使用的属性作为null写入表中的实际值。我怎样才能写只使用过的属性(非空)?或者我怎么才能映射只有非空属性在当前的EF对象?如何处理未在MVC视图中使用的空属性?
编辑: 我想检查不空的属性,可能是这个问题的最佳实践。我怎样才能轻松完成这个映射?
我在视图中使用EF对象作为模型。一些EF对象具有许多我不想在视图中显示的属性。所以我只创建了需要的属性的html控件。但是,当MVC控制器映射时,EF将未使用的属性作为null写入表中的实际值。我怎样才能写只使用过的属性(非空)?或者我怎么才能映射只有非空属性在当前的EF对象?如何处理未在MVC视图中使用的空属性?
编辑: 我想检查不空的属性,可能是这个问题的最佳实践。我怎样才能轻松完成这个映射?
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
}
请不要在没有解释我们正在查看的内容的情况下提供代码转储。 – Andrew
,你可以手动或通过类似AutoMapper工具,您的域名/ EF模型映射到视图模型中,然后你stringly键入您的意见来。在此映射过程中,您可以对属性值执行必要的检查,以使其准备在视图中显示。您也可以在您的ViewModel中创建只读属性,进行空检查,并在需要时显示值(如果存在)或空字符串(例如,如果需要)。
您可以拥有单独的ViewModel类(充当实际EF生成的类的包装),它只包含所需的属性。
或者可以使用Data Annotations
隐藏视图中的一个属性。为了做到这一点,你应该装饰你想隐藏的财产与以下注释。
[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)
隐藏的fiels可能会被用户修改。我不想使用隐藏。 – Baran
@Baran你只能在EF中更新你想要的字段。查看第一个片段。 – ElectricRouge
//你需要更新的所有领域 这项工作必须手工完成。它必须是自动的。 – Baran
属性你问如何只更新在视图中使用的属性?你也可以发布代码 – ElectricRouge
是的,我需要更新只使用的。我没有关于此的代码,只是在研究。 – Baran