例子:

 public class IssArgs
{
public List<IssTabArgs> Tabs { get; set; }
} public class IssTabArgs
{
public int Num { get; set; } public string Tab { get; set; } public List<IssArg> Args { get; set; }
} public class IssArg
{
public int Num { get; set; } public string Name { get; set; } public string Value { get; set; }
}

现在需要上传这样的数据

 @using (Html.BeginForm("SaveGpIss", "Issue"))
{ @foreach (var item in Model.TabArgs.Tabs)
{
@Html.Partial("_ArgsTabPar",item)
} }
@model Web.Models.Vm.Issue.IssTabArgs

    <tbody>
@using (Html.BeginCollectionItem("TabArgs.Tabs"))
{
@Html.HiddenFor(m => m.Num, new { @class = "arg_tab_num" })
<tr class="un">
<td colspan="" class="w">@Html.EditorFor(m=>m.Tab, new { HtmlAttributes = new { PlaceHolder = "表名称" } })</td>
</tr>
foreach (var item in Model.Args)
{
@Html.Partial("_ArgPar",item)
}
}
</tbody>

下面是第级集合的重点

@model Web.Models.Vm.Issue.IssArg

@{
var colId = ViewData.TemplateInfo.HtmlFieldPrefix;
}
<tr>
@using (Html.BeginCollectionItem(colId + ".Args"))
{
@Html.HiddenFor(m=>m.Num,new {@class="arg_num"})
<td class="n">@Html.EditorFor(m => m.Name, new { HtmlAttributes = new { PlaceHolder = "参数名称" } })</td>
<td class="i">@Html.EditorFor(m => m.Value, new { HtmlAttributes = new { PlaceHolder = "参数值" } })</td>
}
</tr>
ViewData.TemplateInfo.HtmlFieldPrefix;
BeginCollectionItem 反编译代码,将 Guid.NewGuid().ToString() 值储存 ViewData.TemplateInfo.HtmlFieldPrefix;
 
using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.Mvc; namespace HtmlHelpers.BeginCollectionItem
{
public static class HtmlPrefixScopeExtensions
{
private const string IdsToReuseKey = "__htmlPrefixScopeExtensions_IdsToReuse_"; public static IDisposable BeginCollectionItem(this HtmlHelper html, string collectionName)
{
return html.BeginCollectionItem(collectionName, html.ViewContext.Writer);
} public static IDisposable BeginCollectionItem(this HtmlHelper html, string collectionName, TextWriter writer)
{
Queue<string> idsToReuse = HtmlPrefixScopeExtensions.GetIdsToReuse(html.ViewContext.get_HttpContext(), collectionName);
string str = idsToReuse.Count > ? idsToReuse.Dequeue() : Guid.NewGuid().ToString();
writer.WriteLine("<input type=\"hidden\" name=\"{0}.index\" autocomplete=\"off\" value=\"{1}\" />", (object) collectionName, (object) html.Encode(str));
return html.BeginHtmlFieldPrefixScope(string.Format("{0}[{1}]", (object) collectionName, (object) str));
} public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
{
return (IDisposable) new HtmlPrefixScopeExtensions.HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
} private static Queue<string> GetIdsToReuse(HttpContextBase httpContext, string collectionName)
{
string str1 = "__htmlPrefixScopeExtensions_IdsToReuse_" + collectionName;
Queue<string> stringQueue = (Queue<string>) httpContext.Items[(object) str1];
if (stringQueue == null)
{
httpContext.Items[(object) str1] = (object) (stringQueue = new Queue<string>());
string str2 = httpContext.Request[collectionName + ".index"];
if (!string.IsNullOrEmpty(str2))
{
string str3 = str2;
char[] chArray = new char[]{ ',' };
foreach (string str4 in str3.Split(chArray))
stringQueue.Enqueue(str4);
}
}
return stringQueue;
} internal class HtmlFieldPrefixScope : IDisposable
{
internal readonly TemplateInfo TemplateInfo;
internal readonly string PreviousHtmlFieldPrefix; public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
{
this.TemplateInfo = templateInfo;
this.PreviousHtmlFieldPrefix = this.TemplateInfo.HtmlFieldPrefix;
this.TemplateInfo.HtmlFieldPrefix = htmlFieldPrefix;
} public void Dispose()
{
this.TemplateInfo.HtmlFieldPrefix = this.PreviousHtmlFieldPrefix;
}
}
}
}

还有一种解决方式就是通过脚本的方式改变input name 的内容,这里不多说了

form 利用BeginCollectionItem提交集合List<T>数据 以及提交的集合中含有集合的数据类型 如List<List<T>> 数据的解决方案的更多相关文章

  1. C#中的集合

    [集合不同于数组,是一组可变类型的.可变数量的元素的组合,这些元素可能共享某些特征,需要以某种操作方式一起进行操作.一般来讲,为了便于操作这些元素的类型是相同的] [集合与数组的区别:数组是连续的.同 ...

  2. ffmpeg从AVFrame取出yuv数据到保存到char*中

    ffmpeg从AVFrame取出yuv数据到保存到char*中   很多人一直不知道怎么利用ffmpeg从AVFrame取出yuv数据到保存到char*中,下面代码将yuv420p和yuv422p的数 ...

  3. python 读取SQLServer数据插入到MongoDB数据库中

    # -*- coding: utf-8 -*-import pyodbcimport osimport csvimport pymongofrom pymongo import ASCENDING, ...

  4. java中的集合和视图

    一.集合的概念 何为集合,集合就是相当于一个对象的容器.集合是类似数组的一个作用.既然有了数组,为何还要有集合呢,由于数组对象一旦创建,其大小便不可以更改,我们只能往数组中存放创建时数量的对象.而集合 ...

  5. JAVA笔记整理(九),JAVA中的集合

    在工作中,我们经常需要将多个对象集中存放,可以使用数组,但是数组的长度一旦固定之后是不可变的,为了保存数量确定的数据,我们可以使用JAVA中的集合. 在我看来,JAVA中的集合可以看作是一个特殊的数据 ...

  6. form表单提交数据,页面必定会刷新,ajax提交数据不会刷新,做到悄悄提交,多选删除,ajax提交实例

    很多页面用到的模态对话框,如知明网站https://dig.chouti.com/的登录页都是模态对话框, 当点登录时,是用的ajax提交,因为输入错了信息,有返回消息,而页面没有刷新. jquery ...

  7. 使用jQuery.form插件,实现完美的表单异步提交

    传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...

  8. js表单动态添加数据并提交

    情景1:已经存在form对象了,动态为form增加对象并提交 function formAppendSubmit(){ var myform=$('#newArticleForm'); //得到for ...

  9. Spring MVC防止数据重复提交

    现实开发中表单重复提交的例子很多,就包括手上这个门户的项目也有这种应用场景,用的次数多,但是总结,这还是第一次. 一.基本原理 使用token,给所有的url加一个拦截器,在拦截器里面用java的UU ...

随机推荐

  1. 程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验

    1,程序异常崩溃后用windbg辅助调试解决的经验  状况:我的程序调用别人的库做 文件写入工作. 在这一过程中出现异常,程序崩溃. 经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错. ...

  2. 零元学Expression Blend 4 - Chapter 28 ListBox的基本运用与更改预设样式

    原文:零元学Expression Blend 4 - Chapter 28 ListBox的基本运用与更改预设样式 本章将先教大家认识ListBox的基本运用与更改预设样式 本章将先教大家认识List ...

  3. SqlServer判断数据库、表、字段、存储过程、函数是否存在

    原文:SqlServer判断数据库.表.字段.存储过程.函数是否存在 判断数据库是否存在 if exists (select * from sys.databases where name = '数据 ...

  4. 中国自主X86处理器工艺跃进:国产28nm升级16nm(上海兆芯)

    提到X86处理器,世人皆知Intel.AMD,殊不知还有个VIA(威盛),在Intel反垄断世纪大战中VIA公司作为Intel霸权的受害者也最终确认了X86授权,不过VIA与前面两家的实力相差太远,X ...

  5. zynqmp(zcu102rev1.0)系列---1---安装 xsdk

    Xilinx 的zynq7020在设备上面已经使用上,并量产,关于zynq7020使用总结将在近期同步进行. 该系列主要记录Xilinx zynqmp系列 的使用以及在遇到的问题.目前手上有一块dem ...

  6. Ptypes一个开源轻量级的c++库,包括对一些I/O操作、网络通信、多线程和异常处理的封装

    C++开源项目入门级:Ptypes    Ptypes一个开源轻量级的c++库,包括对一些I/O操作.网络通信.多线程和异常处理的封装.虽然代码有限,包括的内容不少,麻雀虽小,五脏俱全.    提高: ...

  7. 深入windows的关机消息截获-从XP到Win7的变化(在XP中程序可以阻止关机,但是在Win7中程序无法阻止关机,可Block的时间从1秒调到了5秒) good

    之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时 ...

  8. c# 获取cook

    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...

  9. Qt 访问网络的 HttpClient(封装QNetworkAccessManager,且有服务端)

    Qt 使用 QNetworkAccessManager 访问网络,这里对其进行了简单的封装,访问网络的代码可以简化为: 1 2 3 HttpClient("http://localhost: ...

  10. Python魔法方法__getattr__和__getattribute__详解

    在Python中有这两个魔法方法容易让人混淆:__getattr__和getattribute.通常我们会定义__getattr__而从来不会定义getattribute,下面我们来看看这两个的区别. ...