Asp.net 用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

我有一个名为Server的模型类,并且创建了一个新的ServerToEdit viewModel类,但是当我尝试提交viewModel时,我会在repository.save()方法中遇到以下错误

传递到字典中的模型项的类型为 “TMS.Models.Server”,但此字典需要类型为的模型项 'TMS.ViewModels.ServerToEdit'

viewModel类是:-

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>