C# - ASP.net MVC 3-在表中插入多行

use*_*598 4 c# asp.net-mvc model-binding

我今年是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

这些是有用的,但对我的问题没有帮助.

如果有人可以就此问题向我提出建议,我将非常感激.感谢您的时间

Chr*_*att 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)
}
Run Code Online (Sandbox Code Playgroud)

视图

@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>
}
Run Code Online (Sandbox Code Playgroud)

使用for而不是foreach在这里很重要,这样你就可以得到一个索引器.如果您将索引项目传递给类似的东西Html.EditorFor,Razor将正确生成字段名称,以便将它们作为列表发布.

如果您有未定义或可变数量的项目,那么您负责生成正确的字段名称.对于name项目列表中的字段属性,modelbinder需要以下格式:

ListName[index].FieldName
Run Code Online (Sandbox Code Playgroud)

如果您的POST操作签名如下所示:

[HttpPost]
public ActionResult CreateMyModels(List<MyModel> myModels)
Run Code Online (Sandbox Code Playgroud)

然后你的字段需要命名如下:

myModels[0].FirstField
myModels[0].SecondField
...
myModels[1].FirstField
...
Run Code Online (Sandbox Code Playgroud)

在用于向页面呈现字段集的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);
}
Run Code Online (Sandbox Code Playgroud)