Asp.net 用ViewModel对象替换模型对象将在尝试保存新记录时引发异常
我有一个名为Server的模型类,并且创建了一个新的ServerToEdit viewModel类,但是当我尝试提交viewModel时,我会在repository.save()方法中遇到以下错误 传递到字典中的模型项的类型为 “TMS.Models.Server”,但此字典需要类型为的模型项 'TMS.ViewModels.ServerToEdit' viewModel类是:-Asp.net 用ViewModel对象替换模型对象将在尝试保存新记录时引发异常,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,我有一个名为Server的模型类,并且创建了一个新的ServerToEdit viewModel类,但是当我尝试提交viewModel时,我会在repository.save()方法中遇到以下错误 传递到字典中的模型项的类型为 “TMS.Models.Server”,但此字典需要类型为的模型项 'TMS.ViewModels.ServerToEdit' viewModel类是:- public class ServerToEdit { public Server Serv
public class ServerToEdit
{
public Server Server { get; set; }
[Required]
public String IPAddress { get; set; }
}
创建视图的一部分是:-
model TMS.ViewModels.ServerToEdit
@* This partial view defines form fields that will appear when creating and editing entities *@
@Html.AntiForgeryToken()
<div class="editor-label">
@Html.LabelFor(model => model.Server.CustomerName)
</div>
<div class="editor-field">
@Html.EditorFor(model =>model.Server.CustomerName)
@Html.ValidationMessageFor(model =>model.Server.CustomerName)
</div>
<div class="editor-label">
IP Address
</div>
<div class="editor-field">
@Html.EditorFor(model => model.IPAddress)
@Html.ValidationMessageFor(model => model.IPAddress)
</div>
IPAddress
<div class="editor-label">
@Html.LabelFor(model =>model.Server.ILOIP)
</div>
<div class="editor-field">
@Html.EditorFor(model =>model.Server.ILOIP)
@Html.ValidationMessageFor(model =>model.Server.ILOIP)
</div>
最后,InsertOrUpdateServer存储库方法是:-
public void InsertOrUpdateServer(Server server, TechnologyIP technologyIP)
{
if (server.ServerID == default(int))
{
// New entity
int technologyypeID = GetTechnologyTypeID("Server");
Technology technology = new Technology
{
IsDeleted = true,
TypeID = technologyypeID,
Tag = "S" + GetTagMaximumeNumber(technologyypeID).ToString()
};
InsertOrUpdateTechnology(technology);
Save();
var auditinfo = IntiateAudit(tms.AuditActions.SingleOrDefault(a => a.Name.ToUpper() == "ADD").ActionID,
tms.TechnologyTypes.SingleOrDefault(a => a.Name.ToUpper() == "Server").AssetTypeID,
"TDMGROUP\administrator", technology.TechnologyID);
server.ServerID = technology.TechnologyID;
technologyIP.TechnologyID = technology.TechnologyID;
tms.Servers.Add(server);
InsertOrUpdateTechnologyIP(technologyIP);
technology.IsDeleted = false;
InsertOrUpdateTechnology(technology);
InsertOrUpdateAudit(auditinfo);
}
else
{
// Existing entity
var auditinfo = IntiateAudit(tms.AuditActions.SingleOrDefault(a => a.Name.ToUpper() == "EDIT").ActionID,
tms.TechnologyTypes.SingleOrDefault(a => a.Name.ToUpper() == "Server").AssetTypeID,
"TDMGROUP\administrator", server.ServerID);
tms.Entry(server).State = EntityState.Modified;
tms.Entry(technologyIP).State = EntityState.Modified;
InsertOrUpdateAudit(auditinfo);
}
}
提前感谢您的帮助?首先,将您的ViewModel更改为:
public class ServerToEdit
{
public Server Server { get; set; }
public TechnologyIP TechnologyIP { get; set; }
}
并且,将您的操作更改为:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ServerToEdit serverToEdit)
{
if (ModelState.IsValid)
{
try
{
repository.InsertOrUpdateServer(serverToEdit.Server, serverToEdit.TechnologyIP);
repository.Save();
return RedirectToAction("Index");
}
catch
{
// Some code...
}
}
}
然后,在您看来,您将拥有:
@model TMS.ViewModels.ServerToEdit
@* This partial view defines form fields that will appear when creating and editing entities *@
@Html.AntiForgeryToken()
<div class="editor-label">
@Html.LabelFor(model => model.Server.CustomerName)
</div>
<div class="editor-field">
@Html.EditorFor(model =>model.Server.CustomerName)
@Html.ValidationMessageFor(model =>model.Server.CustomerName)
</div>
@Html.HiddenFor(model => model.TechnologyIP.TechnologyID)
<div class="editor-label">
IP Address
</div>
<div class="editor-field">
@Html.EditorFor(model => model.TechnologyIP.IPAddress)
@Html.ValidationMessageFor(model => model.TechnologyIP.IPAddress)
</div>
<div class="editor-label">
@Html.LabelFor(model =>model.Server.ILOIP)
</div>
<div class="editor-field">
@Html.EditorFor(model =>model.Server.ILOIP)
@Html.ValidationMessageFor(model =>model.Server.ILOIP)
</div>
@model TMS.ViewModels.ServerToEdit
@*此局部视图定义创建和编辑实体时将显示的表单字段*@
@Html.AntiForgeryToken()
@LabelFor(model=>model.Server.CustomerName)
@EditorFor(model=>model.Server.CustomerName)
@Html.ValidationMessageFor(model=>model.Server.CustomerName)
@Html.HiddenFor(model=>model.TechnologyIP.TechnologyID)
IP地址
@EditorFor(model=>model.TechnologyIP.IPAddress)
@Html.ValidationMessageFor(model=>model.TechnologyIP.IPAddress)
@LabelFor(model=>model.Server.ILOIP)
@EditorFor(model=>model.Server.ILOIP)
@Html.ValidationMessageFor(model=>model.Server.ILOIP)
在您的行动中,技术从何而来?它既不在视图模型中,也不在视图中。TechnologyIP只是一个存储@Html.EditorFor(model=>model.IPAddress)和TechnologyID的表。因此,我只需要从视图中获取@Html.EditorFor(model=>model.IPAddress),然后在存储库方法中,我将为此而推广TechnologyID。非常感谢您的帮助,但是有什么不同呢?我认为模型绑定器应该为我做到这一点。为什么模型绑定器应该将字符串值(IPAddress)绑定到TechnoloyIP对象?您还需要在视图中隐藏TechnologyID的输入。查看更新的答案。因为它将检查TechnologyIP.IPAddress和视图上的字段名是否相同。然后它将IPAddress字符串映射到IPAddress对象属性。?我想情况会是这样?
@model TMS.ViewModels.ServerToEdit
@* This partial view defines form fields that will appear when creating and editing entities *@
@Html.AntiForgeryToken()
<div class="editor-label">
@Html.LabelFor(model => model.Server.CustomerName)
</div>
<div class="editor-field">
@Html.EditorFor(model =>model.Server.CustomerName)
@Html.ValidationMessageFor(model =>model.Server.CustomerName)
</div>
@Html.HiddenFor(model => model.TechnologyIP.TechnologyID)
<div class="editor-label">
IP Address
</div>
<div class="editor-field">
@Html.EditorFor(model => model.TechnologyIP.IPAddress)
@Html.ValidationMessageFor(model => model.TechnologyIP.IPAddress)
</div>
<div class="editor-label">
@Html.LabelFor(model =>model.Server.ILOIP)
</div>
<div class="editor-field">
@Html.EditorFor(model =>model.Server.ILOIP)
@Html.ValidationMessageFor(model =>model.Server.ILOIP)
</div>