如何处理MVC View中未使用的null属性?

时间:2014-03-27 08:38:41

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

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

编辑: 我认为检查非null属性可能是此问题的最佳实践。我怎样才能轻松完成这种映射?

4 个答案:

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