MVC 文本框绑定多个属性

MVC Textbox binding multiple properties

我正在尝试找到 present/save 我正在创建的视图中的数据的最佳方法。

我不拘泥于底层 table 结构,并且尝试过尝试获得最佳结果但没有运气。

实际上我有多个文本框需要保存回数据库,但由于视图布局(它确实需要保留在这个布局中),我需要用硬编码信息填充其他列。

在我看来,我只是重复了文本框(我试图为其编制索引,但收到一条错误消息,提示无法对十进制数据类型进行索引?)

下面是我的模型

    namespace Testing.Models
{
    public partial class OnFarm
    {
        public int Id { get; set; }
        public Guid? Tracker { get; set; }
        public int Year { get; set; }
        public decimal? Period1 { get; set; }
        public decimal? Period2 { get; set; }
        public decimal? Period3 { get; set; }
        public decimal? Period4 { get; set; }
        public decimal? Period5 { get; set; }
        public decimal? Period6 { get; set; }
        public decimal? Period7 { get; set; }
        public decimal? Period8 { get; set; }
        public decimal? Period9 { get; set; }
        public decimal? Period10 { get; set; }
        public decimal? Period11 { get; set; }
        public decimal? Period12 { get; set; }
        public int Version { get; set; }
        public int Account { get; set; }
        public int MvtType { get; set; }

        public virtual Account AccountNavigation { get; set; }
        public virtual MovementType MvtTypeNavigation { get; set; }
        public virtual ProductionModule TrackerNavigation { get; set; }
        public virtual Version VersionNavigation { get; set; }
        public virtual Years YearNavigation { get; set; }
    }
}

这是我目前的控制器

        public IActionResult Create(Guid? id)
        {
            var query = _context.LegalEntities.FromSqlRaw("Select DISTINCT B.* From Client.Groups a Left join Client.[Legal Entities] b on b.Parent = a.ID left join client.Enterprises c on c.Parent = b.ID left join client.[Production Module] d on d.Parent = c.ID   left join OnFarm.[On Farm] e on e.Tracker = d.ID Where e.id IS NOT NULL AND a.id = {0}", id).ToList();

            List<SelectListItem> LEList = new List<SelectListItem>();

            foreach (var m in query)
            {
                LEList.Add(new SelectListItem { Text = m.Name, Value = m.Id.ToString() });
            }
            ViewBag.LE = LEList;

            var acclist = _context.Accounts.Where(x => x.AccountCatId == 92100).ToList().OrderBy(x => x.Description);
            List<SelectListItem> listac = new List<SelectListItem>();

            listac.Add(new SelectListItem { Text = "--Select Livestock Type--", Value = "0" });
            if (acclist != null)
            {
                var i = 1;
                foreach (var x in acclist)
                {
                    listac.Add(new SelectListItem { Text = x.Description, Value = x.Number.ToString() });
                    i += 1;
                }
            }
            ViewBag.Account = listac;


            ViewData["MvtType"] = new SelectList(_context.MovementTypes, "Id", "Type");
            ViewData["Tracker"] = new SelectList(_context.ProductionModules, "Id", "Name");
            ViewData["Version"] = new SelectList(_context.Versions, "VersionId", "VersionName");
            ViewData["Year"] = new SelectList(_context.Year, "Id", "Year");
            return View();
        }

这是我的看法

<div class="row">
    @foreach (var item in ViewBag.LE)
    {
        <div class="panel panel-default rounded shadow col-11">
            <div class="panel-heading border-bottom">
                <div class="no-gutters"><h4><b>@item.Text</b></h4></div>
            </div>
            <div class="panel-body">
                <div class="row">

                    @foreach (var i in ViewBag.Tracker)
                    {
                        <div class="row d-flex align-items-center">
                            <div class="panel panel-default rounded shadow col">
                                <div class="panel-heading border-bottom">
                                    <div class="no-gutters text-muted col-5"><h3><b> @i.Text</b></h3></div>
                                    <div class="col-2">
                                        <select asp-for="Account" class="form-control" asp-items="ViewBag.Account"></select>
                                    </div>
                                </div>
                                <div class="panel-body">
                                    <div class="row d-flex align-items-center">
                                        <div class="col-1"><b>Month</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Opening Balance</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Births</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Deaths</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Purchases</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Sold</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Age In</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Age Out</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Adjustments</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Closing Balance</b></div>
                                    </div>
                                    <div class="row d-flex align-items-center">
                                        <div class="col-1">
                                            Apr
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control", disabled = "disabled" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control", disabled = "disabled" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>
                                    </div>


                                </div>
                            </div>
                        </div>
                    }
                </div>
            </div>
        </div>
    }
</div>

现在面板 body 重复 12 次(一年中的每个月)。

保存回数据时,我会为一些核心信息设置一些隐藏字段。但我需要做的是,在保存第一个文本框时,它还需要将 MvtType(硬编码为列标题)保存为列值。

我会将面板包装成一个表单,以便在单击按钮时提交。

最后,底层table。我曾经有一个名为 period 的专栏,一个名为 value,我认为这可能是一种更好的方法吗?而不是每个时期分开。

哦,抱歉,我需要在加载页面时将数据加载到这些文本框

非常感谢任何帮助

编辑 好的,所以我在这里取得了一些进展。我已经整理了我的观点(见下文),现在可以让我的观点传回运动类型的第一列,但其他列中没有任何内容。我实际上希望能够 post 将值返回到周期列,同时将值添加到 Mvt 类型列。

                                <div class="row">
    @foreach (var item in ViewBag.LE)
    {
    <div class="panel panel-default rounded shadow col-11">
        <div class="panel-heading border-bottom">
            <div class="no-gutters"><h4><b>@item.Text</b></h4></div>
        </div>
        <div class="panel-body">
            <div class="row">

                @foreach (var i in ViewBag.Tracker)
                {
                    <form asp-action="Create" class="form-group">

                        <div class="form-group">
                            <label asp-for="Tracker" class="control-label"></label>
                            <select asp-for="Tracker" class="form-control" asp-items="ViewBag.Tracker"></select>
                        </div>

                        <div class="form-group">
                            <label asp-for="Year" class="control-label"></label>
                            <select asp-for="Year" class="form-control" asp-items="ViewBag.Year"></select>
                        </div>

                        <div class="form-group">
                            <label asp-for="Version" class="control-label"></label>
                            <select asp-for="Version" class="form-control" asp-items="ViewBag.Version"></select>
                        </div>


                        <div class="row d-flex align-items-center">
                            <div class="panel panel-default rounded shadow col">
                                <div class="panel-heading border-bottom">
                                    <div class="no-gutters text-muted col-5"><h3><b> @i.Text</b></h3></div>
                                    <div class="col-2">
                                        <select asp-for="Account" class="form-control" asp-items="ViewBag.Account"></select>
                                    </div>
                                </div>
                                <div class="panel-body">
                                    <div class="row d-flex align-items-center">
                                        <div class="col-1"><b>Month</b></div>
                                        <div class="col-1 d-flex justify-content-center"><b>Opening Balance</b></div>
                                        @foreach (var mvt in ViewBag.MVtType)
                                        {
                                            <div class="col-1 d-flex justify-content-center">
                                                <b>@mvt.Text</b>
                                            </div>
                                        }

                                        <div class="col-1 d-flex justify-content-center"><b>Closing Balance</b></div>
                                    </div>

                                    <div class="row d-flex align-items-center">
                                        <div class="col-1">
                                            Apr
                                        </div>
                                        <div class="col-1">
                                            @Html.TextBoxFor(m => m.Period1, new { @class = "form-control", disabled = "disabled" })
                                            <span asp-validation-for="Period1" class="text-danger"></span>
                                        </div>

                                        @for (int z = 0; z < ViewBag.MvtType.Count; z++)
                                        {

                                            <div class="col-1">
                                      
                                                <select asp-for= "MvtType" class="form-control" asp-items="ViewBag.MvtType"></select>
                                                @Html.TextBoxFor(m => m.Period1, new { @class = "form-control" })
                                                <span asp-validation-for="Period1" class="text-danger"></span>
                                            </div>
                                        }

                                            <div class="col-1">
                                                @Html.TextBoxFor(m => m.Period1, new { @class = "form-control", disabled = "disabled" })
                                                <span asp-validation-for="Period1" class="text-danger"></span>
                                            </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="row d-flex align-items-center">
                            <div class="col-8"></div>
                            <div class="col-2">
                                <input type="submit" value="Save" class="btn btn-primary float-right" />
                            </div>
                        </div>

                    </form>
                }
            </div>
        </div>
    </div>
    }
</div>

对了,我已经找到答案了。

在此处遵循此指南Editing Multiple records using model binding in MVC

我得到了答案。

我的视图现在看起来像这样,允许索引文本框,这样我就可以编辑多条记录,而不仅仅是一条!我会更新它,让它看起来更漂亮,并隐藏某些字段

<div class="panel-body">
                                    @using (Html.BeginForm("Index","OnFarms", FormMethod.Post))
                                    {

                                        <table class="table">
                                            @for (int z = 0; z < Model.Count; z++)

                                            {
                                                <tr>
                                                    <td>
                                                       
                                                        @Html.TextBox("OnFarms[" + @z + "].Id", Model[z].Id, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Tracker", Model[z].Tracker, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Year", Model[z].Year, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period1", Model[z].Period1, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period2", Model[z].Period2, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period3", Model[z].Period3, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period4", Model[z].Period4, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period5", Model[z].Period5, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period6", Model[z].Period6, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period7", Model[z].Period7, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period9", Model[z].Period9, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period10", Model[z].Period10, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period11", Model[z].Period11, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Period12", Model[z].Period12, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Version", Model[z].Version, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].Account", Model[z].Account, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                        @Html.TextBox("OnFarms[" + @z + "].MvtType", Model[z].MvtType, new { @class = "form-Control" })
                                                    </td>
                                                    <td>
                                                    </td>

                                                </tr>
                                            }
                                        </table>
                                        <input type="submit" value="Submit" />
                                    }

                                </div>

但关键是将@model 更改为@model List 而不仅仅是 Testing.Models.OnFarm

我的控制器只是

 public  ActionResult Index(List<OnFarm> OnFarms)
        {


                foreach (OnFarm frm in OnFarms)
                {
                    OnFarm Existed_Mvt = _context.OnFarms.Find(frm.Id);
                    Existed_Mvt.Tracker = frm.Tracker;
                    Existed_Mvt.Year = frm.Year;
                    Existed_Mvt.Period1 = frm.Period1;
                    Existed_Mvt.Period2 = frm.Period2;
                    Existed_Mvt.Period3 = frm.Period3;
                    Existed_Mvt.Period4 = frm.Period4;
                    Existed_Mvt.Period5 = frm.Period5;
                    Existed_Mvt.Period6 = frm.Period6;
                    Existed_Mvt.Period7 = frm.Period7;
                    Existed_Mvt.Period8 = frm.Period8;
                    Existed_Mvt.Period9 = frm.Period9;
                    Existed_Mvt.Period10 = frm.Period10;
                    Existed_Mvt.Period11 = frm.Period11;
                    Existed_Mvt.Period12 = frm.Period12;
                    Existed_Mvt.Version = frm.Version;
                    Existed_Mvt.Account = frm.Account;
                    Existed_Mvt.MvtType = frm.MvtType;


                }
                _context.SaveChanges();