通过单个按钮将多行提交到数据库

时间:2015-10-12 10:26:55

标签: c# asp.net-mvc-5

我有一个表单页面,应该更新数据库表中的多行。我使用ViewModel生成表单页面UI。

我希望UI表中的每一行都作为一行发送到数据库表。

Screenshot of UI

Screenshot of the Table

OptionValueID在控制器中设置。但是TcSetID的值来自UI中的Property的ID。

控制器

    public ActionResult Create(int id)
    {

         var model = new SetValue { OptionValueID = id };
        var ov = db.OptionValue.Include(x => x.Option).FirstOrDefault(x => x.OptionValueID == id);
        var opid = ov.OptionID;
        var op = db.Option.Include(x => x.TechnicalCharacteristic).FirstOrDefault(x => x.OptionID == opid);
        var tcid = op.TechnicalCharacteristicID;
        var tc = db.TechnicalCharacteristic.Include(x => x.TcSets).FirstOrDefault(x => x.TechnicalCharacteristicID == tcid);
        var tcset = tc.TcSets;
        var opv = db.OptionValue.FirstOrDefault(x => x.OptionValueID == id);
        ViewBag.OptionValue = opv.OptionVal;
        ViewBag.Option = opv.Option.OptionName;
        ViewBag.Lsystem = opv.Option.Lsystem.LsystemName;
        ViewBag.FamilyName = opv.Option.Lsystem.LsystemFamily.FamilyName;
        ViewBag.TcSetID = new SelectList(tcset, "TcSetID", "SetName");
        //ViewBag.OptionValueID = new SelectList(db.OptionValue,"OptionValueID","OptionVal",)
        return View(model);
    }

public class SetValue
{
    public int SetValueID { get; set; }
    public string Value { get; set; }
    public bool Status { get; set; }


    public int TcSetID { get; set; }
    public int OptionValueID { get; set; }

    public virtual OptionValue OptionValue { get; set; }
    public virtual TcSet TcSet { get; set; }

}

查看(使用ViewModel的摘录)

    <div class="form-horizontal">
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        @Html.HiddenFor(model => model.OptionValueID)
        @Html.LabelFor(model => model.TcSetID, "TcSetID", htmlAttributes: new { @class = "control-label col-md-2" })

        <div class="col-md-10">
            @Html.DropDownList("TcSetID", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.TcSetID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Value, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Value, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Value, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Status, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            <div class="checkbox">
                @Html.EditorFor(model => model.Status)
                @Html.ValidationMessageFor(model => model.Status, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>

我需要将所有值提交给Create方法,以便将值保存到表中。手动添加了图像中数据库表中的数据。

我试图创建ViewModel的对象列表。正如我在SO中的几个问题中所读到的那样。但是我无法创建ViewModel对象列表,因为它显示ViewModel是一个类型并且正在用作变量。

List<AddSetValue> as = new List<AddSetValue> {new AddSetValue{SetValue=new SetValue{OptionValueID=6},TcSet=tcset.TcSets}};

正如我在其他答案中读到的那样,我应该为我的视图中的每一行编制索引,并且必须在我的Post Create方法中将其提交到forloop中的每一行。但我目前无法指定一份清单。

还有其他方法可以将多行提交到数据库吗?

1 个答案:

答案 0 :(得分:1)

如果需要viewModel的列表,只需创建对象的List。阻碍了某些事情(但正确添加你的属性,因为我还没有完全理解你的对象。

var viewModel = new List<AddSetValue>();

viewModel.Add(new AddSetValue
{
    SetValue = new SetValue{
        OptionValueID = 6
    }
};

在视图中,你应该有以下模型添加顶部:

@model List<ViewModels.AddSetValue>

而不是:

@model ViewModels.AddSetValue

在这些更改之后,您应该可以遍历对象列表......您应该使用索引列表选项:

for(var i = 0; i < Model.Count; i++)
{
    ...
}