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

时间:2014-04-08 11:28:30

标签: 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

这些对我的问题很有用,但没有帮助。

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

2 个答案:

答案 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();    
}