不将 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);
}
我正在创建一个跟踪应用程序来跟踪某些服务器及其构建信息。我希望用户填写一个表单,然后在两个单独的 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);
}