C# MVC当视图中的字段多于保存数据所需的字段时,如何使用视图模型模式

C# MVC当视图中的字段多于保存数据所需的字段时,如何使用视图模型模式,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我的MVC页面用于插入和更新。到目前为止,它可以很好地显示数据,但当单击“提交”按钮时,会出现以下错误: "No parameterless constructor defined for this object." MissingMethodException: No parameterless constructor defined for this object.] 它将命中无参数构造函数,它现在被注释掉了。 viwemodel上有50个额外字段,仅用于显示,在插入/更新中不需要。

我的MVC页面用于插入和更新。到目前为止,它可以很好地显示数据,但当单击“提交”按钮时,会出现以下错误:

 "No parameterless constructor defined for this object."

 MissingMethodException: No parameterless constructor defined for this object.]
它将命中无参数构造函数,它现在被注释掉了。 viwemodel上有50个额外字段,仅用于显示,在插入/更新中不需要。表单上的表单字段少于viewmodel中的表单字段

是否有处理这种情况的工作代码示例? 我在这里看到了公认的答案,这可能有用,但我需要一个完整的工作示例,因为我是新来的:


错误消息非常清楚:在模型类中需要一个无参数构造函数


因此,您需要在IncidentViewModel类中添加另一个没有参数的构造函数,或者需要从现有构造函数中删除该参数。

错误消息非常清楚:您的模型类中需要一个无参数构造函数


因此,您需要在IncidentViewModel类中添加另一个没有参数的构造函数,或者需要从现有的构造函数中删除该参数。

我认为您必须从ViewModel中删除该构造函数。我认为viewmodels与数据方法和构造函数无关。控制器负责这些职责,您可以在控制器操作中简单地用如下内容替换构造函数:

IncidentViewModel vwIncidentData = new IncidentViewModel();
if(objIncidentBO.objIncident.IncidentModel.IncidentId !=0)
{
vwIncidentData.IncidentId = objIncidentBO.objIncident.IncidentModel.IncidentId;
vwIncidentData.objIncident = IncidentModelBO.Get(incidentId);
}
无论如何,此行可能会导致执行错误问题,因此请检查它并确保它不为null:

objIncidentBO.objIncident.IncidentModel.IncidentId

我认为您必须从ViewModel中删除构造函数。我认为viewmodels与数据方法和构造函数无关。控制器负责这些职责,您只需在控制器操作中用类似的内容替换构造函数:

IncidentViewModel vwIncidentData = new IncidentViewModel();
if(objIncidentBO.objIncident.IncidentModel.IncidentId !=0)
{
vwIncidentData.IncidentId = objIncidentBO.objIncident.IncidentModel.IncidentId;
vwIncidentData.objIncident = IncidentModelBO.Get(incidentId);
}
无论如何,此行可能会导致执行错误问题,因此请检查它并确保它不为null:

objIncidentBO.objIncident.IncidentModel.IncidentId

Robert,-您可能还没有看到我上面描述的部分内容,我已经提到添加了一个没有参数的构造函数,并且它使用了该构造函数。为了保存dataSorry,它需要将模型作为上面显示的参数来命中构造函数,看起来您是对的,hrdrdiab也是对的。谢谢大家。这很有帮助。罗伯特,-你可能还没有看到我上面的部分描述,我已经提到添加了一个没有参数的构造函数,它使用了这个构造函数。为了保存dataSorry,它需要将模型作为上面显示的参数来命中构造函数,看起来您是对的,hrdrdiab也是对的。谢谢大家。这很有帮助。正如Robert的回答所述,您必须拥有一个无参数构造函数,因为
DefaultModelBinder
使用
Activator.CreateInstance()
初始化您的模型,如果您没有异常,它将抛出异常。但是,尽管您的模型名称不同,但它在MVC上下文中不是视图模型。视图模型不应包含数据模型,也不应包含数据库访问代码。建议你阅读非常感谢你解释我遗漏了什么。我有很多东西要学。正如Robert的回答所述,您必须有一个无参数构造函数,因为
DefaultModelBinder
使用
Activator.CreateInstance()
初始化您的模型,如果您没有异常,它会抛出异常。但是,尽管您的模型名称不同,但它在MVC上下文中不是视图模型。视图模型不应包含数据模型,也不应包含数据库访问代码。建议你阅读非常感谢你解释我遗漏了什么。我有很多东西要学。
objIncidentBO.objIncident.IncidentModel.IncidentId