不将 HTTP POST 数据插入到两个单独的表中

Not inserting HTTP POST data into two separate tables

我正在创建一个跟踪应用程序来跟踪某些服务器及其构建信息。我希望用户填写一个表单,然后在两个单独的 table 中执行 INSERT。这是我的代码,但它只填充 "Server" table 而不是 "System_Build_Information" table。我也尝试过更改绑定,甚至将它们放在一起。顺便说一句,这段代码来自我的服务器控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Server_Name,Server_Role,Server_OS")] Server server, [Bind(Include = "Model")] System_Build_Information sys)
{
    if (ModelState.IsValid)
    {
        db.Servers.Add(server);
        db.System_Build_Information.Add(sys);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.Server_Role = new SelectList(db.Server_Roles, "Id", "Server_Role", server.Server_Role);
    ViewBag.Server_OS = new SelectList(db.Operating_System, "Id", "Operating System", server.Server_OS);
    string[] environments = new string[] { "Virtual", "Physical" };
    ViewBag.Environments = new SelectList(environments);
    return View(server);
}

我认为默认模型绑定器无法绑定到您已传递的两个 classes(并且 Bind() 语句也可能会干扰)。如果您需要将来自两个模型的信息放入视图中并 POST 返回,请创建一个新的视图模型 class,其中包含这两个 classes 的模型。

public class ServerInfoViewModel{
    public Server ServerInfo {get;set;}

    public System_Build_Information SystemBuildInfo {get;set;}
}

现在,将此视图模型来回发送到您的视图。

@model namespace.ServerInfoViewModel

并使用表单中的属性

@Html.TextBoxFor(x=>x.ServerInfo.Type)
@Html.TextBoxFor(x=>x.SystemBuildInfo.SomeField)

最后,您需要更新 POST 操作方法以绑定新的视图模型

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ServerInfoViewModel model)
{
    if (ModelState.IsValid)
    {
        db.Servers.Add(model.ServerInfo);
        db.System_Build_Information.Add(model.SystemBuildInfo);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.Server_Role = new SelectList(db.Server_Roles, "Id", "Server_Role", server.Server_Role);
    ViewBag.Server_OS = new SelectList(db.Operating_System, "Id", "Operating System", server.Server_OS);
    string[] environments = new string[] { "Virtual", "Physical" };
    ViewBag.Environments = new SelectList(environments);
    return View(model);
}