【发布时间】:2014-05-30 13:25:57
【问题描述】:
当我在工作中开发应用程序时,出现错误:
Value cannot be null. Parameter name: input
有一个lots of post talking about that,所以我阅读了它们并且......没有解决方案。
很高兴继续。所以我检查了数据库模型中是否有任何属性不可为空试图插入而不是,所有这些属性都可以为空(身份除外),所以这不是问题。所以我意识到引发错误的 View Model 是从 Model 类继承,我想:“这可能是问题吗?”。所以我不再继承模型并重新开始工作。
请注意,这不是我第一次发生这种情况,两周前我遇到了同样的情况,就是因为它。
为什么我从模型类继承?因为它有 +10 属性,我需要它在视图中显示这些值,但我还需要显示来自另一个模型类的值,所以我创建了一个视图模型:
class ViewModel: ModelClass{
//ModelClass contains +10 properties
//and the current class contains 7 properties
public ModelClass CastToModelClass()
{
return new ModelClass{ /*stuff...*/ }// casting the current properties values to the ModelClass class
}
}
当我插入新铸造的模型时出现错误:
public JsonResult Save(ViewModel model)
{
var modelClass = model.CastToModelClass();
// here there are not empty properties
context.ModelClass.Add(modelClass);
context.SaveChanges();// error throw
}
所以我的问题是,为什么从 Model 类继承是错误的?
【问题讨论】:
-
您的 ViewModel 应该与您的模型分开(即在此上下文中的实体)。请记住,“ViewModel”是 视图的模型。换句话说,它可以显示原始模型的相同、紧凑或转换的信息。您是否尝试过通过 ViewModel 的构造函数传入模型类的实例?这就是我的方法,而且效果很好。我很乐意提供一个例子。
-
@MarioJVargas 是的,这也是我的方法(也是我能找到的最佳解决方案)。你能解释一下你在这里说的话吗:“你的 ViewModel 应该与你的模型分开(即在这种情况下的实体)。记住“ViewModel”是视图的模型”。我很想知道这意味着什么。
-
视图模型正是它所说的,它是视图显示的模型。您的另一个模型是域模型,这是数据库关心的东西。我们使用视图模型来改变域模型在视图上的呈现方式。
-
你不能直接插入你的视图模型。您必须将其映射回基类(即域模型)才能做到这一点。出于理智考虑,我建议为此目的使用 AutoMapper 之类的东西。
-
@Yuck 说得好。但是我没有直接插入我的视图模型,也没有对 ModelClass 进行强制转换,而是从 ViewModel 类的值创建了一个全新的 ModelClass 实例。但我明白了。
标签: c# asp.net-mvc entity-framework inheritance