今年我是ASP.net MVC的新手。
问题 我将如何实现一个接受多次插入数据库的方法/模型类/视图?
我知道我将不得不使用模型绑定技术,但我不确定如何在我的项目中实现它。
建议的答案 一个解决方案是一个使用多个插入实现视图的简单示例/模板。 (控制器,型号,视图代码示例)
示例Sceanrio :我有一个产品表,我想插入/创建11种产品类型。因此,在我的方法/视图中插入11次产品表。
我一直在研究使用以下方法探索可能的解决方案:
https://stackoverflow.com/search?q=model+binding+to+a+collection
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
这些对我的问题很有用,但没有帮助。
如果有人可以就此问题向我提出建议,我将非常感激。 谢谢你的时间
答案 0 :(得分:6)
首先,我同意@AndrewCounts。你的问题相当广泛,很难提供高质量的答案。但是,我可以给你一些一般的指导,希望能帮助你。
一般来说,如果您正在谈论插入多行,那么您实际上只是在谈论提供一个表单,其中包含一组重复字段,这些字段作为对象列表提交。如果您有定义数量的项目,则可以将对象列表作为视图的模型传递:
GET行动
public ActionResult CreateMyModels()
{
var myModels = new List<MyModel>();
for (var i = 0; i < totalItems; i++)
{
myModels.Add(new MyModel());
}
return View(myModels)
}
查看强>
@model List<Namespace.To.MyModel>
@using (Html.BeginForm())
{
for (var i = 0; i < Model.Count(); i++)
{
// Model fields here, i.e.
// @Html.EditorFor(m => m[i].SomeField)
}
<button type="submit">Submit</button>
}
在此处使用for
而不是foreach
非常重要,这样您才能获得索引器。如果您将索引项目传递给Html.EditorFor
之类的内容,Razor将正确生成字段名称,以便将它们作为列表发布。
如果您有未定义或可变数量的项目,那么您负责生成正确的字段名称。模型绑定器期望项目列表中字段的name
属性具有以下格式:
ListName[index].FieldName
如果你的POST动作签名如下:
[HttpPost]
public ActionResult CreateMyModels(List<MyModel> myModels)
然后您的字段需要命名为:
myModels[0].FirstField
myModels[0].SecondField
...
myModels[1].FirstField
...
在用于向页面呈现字段集的JavaScript中,您需要确保正确设置name
属性。
无论您使用哪种方法,您的POST操作都是相同的。你会收到一份清单,你需要插入每一个。我将为此示例假设实体框架,因为大多数MVC应用程序将使用它。您需要明显修改此代码以适合您自己的情况:
[HttpPost]
public ActionResult CreateMyModels(List<MyModel> myModels)
{
if (ModelState.IsValid)
{
foreach (var myModel in myModels)
{
db.MyModels.Add(myModel);
}
db.SaveChanges();
return RedirectToAction("Index");
}
return View(myModels);
}
答案 1 :(得分:0)
[HttpPost]
public ActionResult Index(List<Employee> employees)
{
CompanyEntities DbCompany = new CompanyEntities();
foreach (Employee Emp in employees)
{
Employee Existed_Emp = DbCompany.Employees.Find(Emp.ID);
Existed_Emp.Name = Emp.Name;
Existed_Emp.Gender = Emp.Gender;
Existed_Emp.Company = Emp.Company;
}
DbCompany.SaveChanges();
return View();
}