【问题标题】:Entity Framework ASP.NET MVC private model fields实体框架 ASP.NET MVC 私有模型字段
【发布时间】:2012-01-09 05:53:53
【问题描述】:

我们的数据库中有一个字段确实应该是布尔值,但出于某种原因,最初的开发人员将其设置为 CHAR,将设置为“1”或“0”。

    [Column("CHARGEABLE")]
    [StringLength(1)]
    private string Chargeable { get; set; }

我希望我的模型将此字段表示为布尔值,所以我想我可以向我的模型添加一个属性来包装它:

    [NotMapped]
    public bool ChargeableTrue
    {
        get
        {
            return Chargeable == "1" ? true : false;
        }
        set
        {
            Chargeable = value ? "1" : "0";
        }
    }

现在在我的视图上我只显示 EditorFor ( ChargeableTrue ),但是当我点击保存时它实际上并没有更新它。

我认为正在发生的事情是,当模型被更新时,它仍然试图从视图中获取“Chargeable”的值,即使我没有在那里显示它。而且由于没有输入字段,它只是变为 null 并最终将其保存到数据库中。

        if (ModelState.IsValid)
        {
            db.Entry(call).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

在这种情况下人们应该做什么?

【问题讨论】:

    标签: asp.net-mvc entity-framework


    【解决方案1】:

    根据 KMan 的回答,这是扩展版本,以防您不熟悉创建视图模型。

    我们的想法是,您的域对象并不是您想要完全从您的视图中更新的内容。相反,您可以创建一个中间人,该中间人还可以包含特定于视图的项目(例如要填充下拉列表的对象列表)。

    public class MyViewModel {
        public bool Chargeable { get; set; }
    }
    

    现在你可以这样做了:

    @* In view *@
    Html.EditorFor(m => m.Chargeable)
    
    // In controller
    public ActionResult Save(MyViewModel model) {
        if (ModelState.IsValid) {
            var domainObject = new MyObject() {
                Chargeable = model.Chargeable ? "1" : "0"
            };
    
            // the rest of your code using domainObject
        }
    }
    

    我会考虑创建一个域对象的构造函数的重载,它接受你的视图模型以将映射保存在一个地方。我通常使用 AutoMapper 之类的工具来映射对象或手动扩展方法。

    视图模型通常包含域对象属性的子集,但可以包含所有这些属性或更多属性,如列表、可见性状态等。它们非常有用,我从未做过 MVC 项目我没用过。

    【讨论】:

      【解决方案2】:

      使用视图模型并在控制器上进行映射。

      【讨论】:

      • 当您的域与您想要的视图不匹配时,我会这样做。 +1
      • 这就是我最终要做的事情,现在我遇到的问题比开始时要多。
      • 我如何“制作我的映射”?您的意思是使用视图模型中的字段手动更新模型对象的每个字段吗?
      • @subkamran 这个问题是给你的(我忘了把你的名字放进去)。非常感谢您提供的任何建议。
      • 我通常使用AutoMapper 之类的工具。所以,以Mapper.Map<DomainObject>(viewModel) 为例;减少了您需要做的手动映射的数量。另见:stackoverflow.com/questions/5306655/…
      猜你喜欢
      • 2011-07-22
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 2020-05-26
      相关资源
      最近更新 更多