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

时间:2015-02-05 22:13:11

标签: c# asp.net-mvc entity-framework http-post

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

[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);
}

1 个答案:

答案 0 :(得分:1)

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

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);
}