首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC BeginCollectionItem

MVC BeginCollectionItem
EN

Stack Overflow用户
提问于 2018-02-06 16:40:13
回答 1查看 2.3K关注 0票数 1

让我的部分视图BeginCollectionItem保存到数据库中有一些问题。我有一个表单,它有一个动态数量的“区段”,可以添加到页面中,在每个字段中都有一个文本框,用户可以在其中输入节名。

据我所知,部分视图中的BeginCollectionItem正在正常工作,但是我不能将信息发布到数据库。在我的其他表单中,我使用了bind()将数据发送到数据库,是否有可能将其放入列表中,然后通过bind发布呢?

我在下面列出了我的代码:,The Model:

代码语言:javascript
复制
namespace project.Models.SetupViewModels
{
    public class SOPTopTemplateBuilderViewModel
    {
        public List<Section> Section { get; set; }
    }

    public class Section {
        public int SectionId { get; set; }
        public string SectionText { get; set; }
        public string TopTempId { get; set; }
    }
}

cshtml:

代码语言:javascript
复制
    @model IEnumerable<project.Models.SetupViewModels.Section>
    @using (Html.BeginForm("SOPTopTemplateBuilder", "Setup", FormMethod.Post))
    {
     <div class="main-holder" id="theform">
     @foreach(var item in Model)
     {
         @Html.Partial("_SectionCreator", item)
     }
     </div>
     <button id="add" type="button">Add</button>
         <div class="form-group submit-row">
              <div class="col-12 float-to-right">
                   <input type="submit" class="btn btn-default" value="continue" />
              </div>
         </div>
    }
@section Scripts {
    <script>
$(document).ready(function () {
        var url = '@Url.Action("AddSection")';
        var form = $('form');
        var recipients = $('#theform');
        $('#add').click(function() {
            $.post(url, function(response) {
                recipients.append(response);
                // Reparse the validator for client side validation
                form.data('validator', null);
                $.validator.unobtrusive.parse(form);
                });
            });
        });
    </script>
}

部分视图:

代码语言:javascript
复制
@model project.Models.SetupViewModels.Section
@using HtmlHelpers.BeginCollectionItemCore

@using (Html.BeginCollectionItem("Section"))
{
    <div class="new-section">
        <div>
            <p>New Section</p>
             @Html.HiddenFor(m => m.SectionId, new { @class="id" })
            @Html.EditorFor(m => m.SectionText, new { @class = "form-control limit-form"})
         </div>
    </div>
}

控制器:

代码语言:javascript
复制
[HttpPost]
public PartialViewResult AddSection()
{      
      return PartialView("_SectionCreator", new Section());
}

[HttpGet]
public ActionResult SOPTopTemplateBuilder(){

      List<Section> model = new List<Section>();

      return View(model);
}

[HttpPost]
public ActionResult SOPTopTemplateBuilder(IEnumerable<Section> soptop)
{
      if (ModelState.IsValid)
      {}
      return View(soptop);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 01:05:22

使用Html.BeginCollectionItem("Section")可以将Section[xxxx]添加到name属性(其中xxxxGuid),以便使用

代码语言:javascript
复制
<input name="Section[xxxx].SectionId" .... />

它回发到包含名为Sections的集合属性的模型。

由于您已经有了带有该属性的模型,所以可以将POST方法更改为

代码语言:javascript
复制
[HttpPost]
public ActionResult SOPTopTemplateBuilder(SOPTopTemplateBuilderViewModel soptop)

其他选择包括

  1. 使用现有的POST方法,并使用Html.BeginCollectionItem("")省略“节”前缀,这将生成name="[xxxx].SectionId"
  2. 将POST方法签名更改为public ActionResult SOPTopTemplateBuilder(IEnumerable<Section> section) (其中参数的名称与前缀的名称匹配)
  3. 使用BindAttribute从窗体值public ActionResult SOPTopTemplateBuilder([Bind(Prefix = "Section")]IEnumerable<Section> soptop)中“删除”前缀

另外,您应该编辑数据,所以应该始终使用视图模型(比如public class SectionViewModel),而不是在视图中使用数据模型。- What is ViewModel in MVC?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48647855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档