Asp.net mvc MVC BeginCollectionItem

Asp.net mvc MVC BeginCollectionItem,asp.net-mvc,razor,begincollectionitem,Asp.net Mvc,Razor,Begincollectionitem,我在将部分视图BeginCollectionItem保存到数据库时遇到一些问题。我有一个表单,它有一个可以添加到页面中的动态数量的“节”,在每个字段中都有一个文本框,用户可以在其中输入节名 就我所知,部分视图中的BeginCollectionItem工作正常,但是我无法将信息发布到数据库。在我的其他表单中,我使用[bind()]将数据发送到数据库,是否可以将其放入列表中,然后通过绑定发布 我已将我的代码包括在下面: 模型: namespace project.Models.SetupViewMo

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

就我所知,部分视图中的BeginCollectionItem工作正常,但是我无法将信息发布到数据库。在我的其他表单中,我使用[bind()]将数据发送到数据库,是否可以将其放入列表中,然后通过绑定发布

我已将我的代码包括在下面: 模型:

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; }
    }
}
    @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>
}
@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>
}
[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);
}
namespace project.Models.SetupViewModels
{
公共类SOPTOPTemplateBuilderServiceModel
{
公共列表节{get;set;}
}
公共课组{
public int SectionId{get;set;}
公共字符串部分文本{get;set;}
公共字符串TopTempId{get;set;}
}
}
cshtml:

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; }
    }
}
    @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>
}
@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>
}
[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);
}
@model IEnumerable
@使用(Html.BeginForm(“SOPTopTemplateBuilder”,“Setup”,FormMethod.Post))
{
@foreach(模型中的var项目)
{
@Html.Partial(“\u SectionCreator”,项)
}
添加
}
@节脚本{
$(文档).ready(函数(){
var url='@url.Action(“AddSection”);
变量形式=$('form');
风险值接收人=$(“#形式”);
$('#添加')。单击(函数(){
$.post(url、函数(响应){
收件人。追加(应答);
//为客户端验证重新分析验证器
表单数据('验证器',空);
$.validator.unobtrusive.parse(表单);
});
});
});
}
局部视图:

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; }
    }
}
    @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>
}
@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>
}
[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);
}
@model project.Models.SetupViewModels.Section
@使用HtmlHelpers.BeginCollectionItemCore
@使用(Html.BeginCollectionItem(“节”))
{
新章节

@HiddenFor(m=>m.SectionId,新的{@class=“id”}) @EditorFor(m=>m.SectionText,新的{@class=“form control limit form”}) }
控制器:

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; }
    }
}
    @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>
}
@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>
}
[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);
}
[HttpPost]
公共PartialViewResult AddSection()
{      
返回PartialView(“_SectionCreator”,new Section());
}
[HttpGet]
公共操作结果SOPTopTemplateBuilder(){
列表模型=新列表();
返回视图(模型);
}
[HttpPost]
公共操作结果SOPTopTemplateBuilder(IEnumerable soptop)
{
if(ModelState.IsValid)
{}
返回视图(soptop);
}

使用
Html.BeginCollectionItem(“Section”)
Section[xxxx]
附加到name属性(其中
xxxx
Guid
)以便生成具有

<input name="Section[xxxx].SectionId" .... />
其他选择包括

  • 使用现有的POST方法并省略“Section”前缀 使用将生成
    name=“[xxxx].SectionId”
  • 将POST方法签名更改为
    public ActionResult
    SOPTopTemplateBuilder(IEnumerable部分)
    (其中 参数的名称与前缀的名称匹配)
  • 使用
    BindAttribute
    从表单值中“去除”前缀
    公共操作结果SOPTopTemplateBuilder([Bind(Prefix=“Section”)]IEnumerable soptop)

  • 作为旁注,您需要编辑数据,因此您应该始终使用视图模型(例如
    公共类SectionViewModel
    ),而不是在视图中使用数据模型。-

    欢迎来到SO。请你把标题改成更自然的(用一句简短的话概括一下你的问题)。标题是人们看到的第一件事,可能会更好地吸引正确的人的注意,他们可能会提供答案。另外请注意,没有“MVC6”。只有旧的ASP.NET MVC 5和新的ASP.NET核心MVC(1.x和2.x)谢谢!我已经使用了绑定前缀方法&它起作用了!我不得不把它改成Section,而不是Section,但是现在它把所有的信息都放进了数据库。