Asp.net mvc 实体框架ASP.NET MVC私有模型字段

Asp.net mvc 实体框架ASP.NET MVC私有模型字段,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我们的数据库中有一个字段实际上应该是布尔值,但出于某种原因,最初的开发人员将其设置为CHAR,可以设置为“1”或“0” 我希望我的模型将此字段表示为布尔值,因此我想我可以向模型中添加一个属性来包装它: [NotMapped] public bool ChargeableTrue { get { return Chargeable == "1" ? true : false; } set

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

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

    [NotMapped]
    public bool ChargeableTrue
    {
        get
        {
            return Chargeable == "1" ? true : false;
        }
        set
        {
            Chargeable = value ? "1" : "0";
        }
    }
现在在我的视图中,我只显示EditorFor(ChargeableTrue),但当我单击save时,它实际上并没有更新它

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

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

在这种情况下,您应该怎么做?

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

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

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

其思想是,您的域对象并不是您希望从视图中准确更新的对象。相反,您可以创建一个中间人,该中间人还可以包括视图特定的项目(如要填充下拉列表的对象列表)

现在您可以执行以下操作:

@* 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项目中使用过它们。

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

其思想是,您的域对象并不是您希望从视图中准确更新的对象。相反,您可以创建一个中间人,该中间人还可以包括视图特定的项目(如要填充下拉列表的对象列表)

现在您可以执行以下操作:

@* 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项目。

当域与视图中的内容不匹配时,我会这样做+1这就是我最后所做的,现在我遇到的问题比开始时更多。我如何“制作我的映射”?你的意思是用视图模型中的字段手动更新模型对象的每个字段吗?@subkamran这个问题是问你的(我忘了把你的名字写进去)。如果您能提供任何建议,我将不胜感激。我通常使用类似的工具。因此,
Mapper.Map(viewModel)
作为一个例子;减少需要进行的手动映射的数量。另请参见:当您的域与视图中的内容不匹配时,我会这样做+1这就是我最后所做的,现在我遇到的问题比开始时更多。我如何“制作我的映射”?你的意思是用视图模型中的字段手动更新模型对象的每个字段吗?@subkamran这个问题是问你的(我忘了把你的名字写进去)。如果您能提供任何建议,我将不胜感激。我通常使用类似的工具。因此,
Mapper.Map(viewModel)
作为一个例子;减少需要进行的手动映射的数量。另见:
@* 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
    }
}