asp.net-core-2.0 – ASP.NET MVC Core 2.0中多个记录的表数据条
发布时间:2020-12-16 06:40:42 所属栏目:asp.Net 来源:网络整理
导读:我正在构建一个应用程序,我的应用程序的一个要求是,当用户必须创建每个事务的卷时,用户希望能够在单击保存之前放置多个事务,因此用户可以选择向表(使用 javascript).以下是我所谈论的图像. 我的View有一个名为VolumeConfigModel和ConfigItem的类,其代码如下
我正在构建一个应用程序,我的应用程序的一个要求是,当用户必须创建每个事务的卷时,用户希望能够在单击保存之前放置多个事务,因此用户可以选择向表(使用
javascript).以下是我所谈论的图像.
我的View有一个名为VolumeConfigModel和ConfigItem的类,其代码如下: public class VolumenConfigViewModel { public int CompanyId { get; set; } public string CompanyName { get; set; } public List<ConfigItem> Configurations { get; set; } } public class ConfigItem { public int TranTypeId { get; set; } public int MaxVolume { get; set; } public int PaymentId { get; set; } } 我的Add.cshtml文件如下所示: @model IEnumerable<VolumenConfigViewModel> <form id="addVolConfig" asp-controller="Volumen" asp-action="Add" role="form" method="post"> <div asp-validation-summary="All" class="text-danger"></div> <input type="hidden" asp-for="@Model.CompanyId" /> <div><span>Configurations for Company @Model.CompanyName</span></div> <table class="table" id="tblConfig" name="tblConfig"> <thead> <tr> <th> Tran Type </th> <th> Payment Type </th> <th> Max Vol </th> </tr> </thead> <tbody> @foreach (var grd in Model.Configurations) { <tr> <td> @Html.DropDownListFor(modelItem => grd.TranTypeId,(IEnumerable<SelectListItem>)ViewBag.TranTypes,"Please select",new { @class = "form-control" }) </td> <td> @Html.DropDownListFor(modelItem => grd.PaymentId,(IEnumerable<SelectListItem>)ViewBag.Payments,new { @class = "form-control" }) </td> <td> @Html.EditorFor(modelItem => grd.MaxVolume) </td> </tr> } </tbody> </table> 这是我的两个问题: >每次用户单击“添加行”时,如何添加新行? 对不起,我问了两个问题,但两者都是同一个问题. 非常感谢你对此的帮助. 解决方法
MVC绑定器将使用name将数据绑定回模型,因此如果你输入像Configurations [0] .TranType这样的名称,它将作为列表发回.您可以使用以下扩展方法来实现这一点
这个是下拉列表 /// Custom helper to return select element for each property in the object that is represented by the expression and element is made disabled depending on the give input /// This SubDropDownListFor is used to generate DDropdown IDs fully compatible with ModelBinder when submitting a list of items. /// </summary> /// <typeparam name="TModel"></typeparam> /// <typeparam name="TProperty"></typeparam> /// <param name="htmlHelper"></param> /// <param name="expression"></param> /// <param name="selectList"></param> /// <param name="elementIndex"></param> /// <param name="optionLabel"></param> /// <param name="htmlAttributes"></param> /// <param name="isReadOnly"></param> /// <returns></returns> public static MvcHtmlString SubDropDownListFor<TModel,TProperty>(this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel,TProperty>> expression,SelectList selectList,int elementIndex,string optionLabel = null,object htmlAttributes = null,bool isReadOnly = false) { var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); if (isReadOnly) { attrs.Add("disabled","disabled"); } Func<TModel,TProperty> method = expression.Compile(); TProperty prop = method(htmlHelper.ViewData.Model); var dropdownName = ExpressionHelper.GetExpressionText(expression); dropdownName = dropdownName.Substring(dropdownName.LastIndexOf('.') + 1); Regex r = new Regex(@"^.*?(.*).Model.(?<par1>.*?).ElementAt.*).(?<par2>.*?)$"); MatchCollection mcKVPs = r.Matches(expression.Body.Reduce().ToString()); var kvps = from Match m in mcKVPs where mcKVPs != null where mcKVPs.Count > 0 select new { val1 = m.Groups["par1"].Value,val2 = m.Groups["par2"].Value }; var kvp = kvps.FirstOrDefault(); var selectTag = new TagBuilder("select"); var metaData = ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData); var displayname = metaData.DisplayName.IsNull() ? dropdownName : metaData.DisplayName; if (kvp.IsNotNull()) { selectTag.Attributes["id"] = kvp.val1 + "_" + elementIndex + "_" + kvp.val2; selectTag.Attributes["name"] = kvp.val1 + "[" + elementIndex + "]." + kvp.val2; } else { selectTag.Attributes["id"] = attrs["id"].IsNotNull() ? attrs["id"].ToString() : elementIndex+"_"+dropdownName; selectTag.Attributes["name"] = attrs["name"].IsNotNull() ? attrs["name"].ToString() : "[" + elementIndex + "]." + dropdownName; } StringBuilder builder = new StringBuilder().AppendLine(); if (optionLabel != null) { builder.AppendLine(ListItemToOption(new SelectListItem { Text = optionLabel,Value = "" })); } if (selectList != null) { foreach (var item in selectList) { builder.AppendLine(ListItemToOption(item,prop.ToCString())); } } selectTag.InnerHtml = builder.ToString(); selectTag.MergeAttributes(attrs); return new MvcHtmlString(selectTag.ToString(TagRenderMode.Normal)); } private static string ListItemToOption(SelectListItem item,string selected=null) { TagBuilder builder = new TagBuilder("option") { InnerHtml = HttpUtility.HtmlEncode(item.Text) }; if (item.Value != null) { builder.Attributes["value"] = item.Value; } if (item.Value == selected) { builder.Attributes["selected"] = "selected"; } return builder.ToString(TagRenderMode.Normal); } 这是用于文本框的 /// <summary> /// Custom helper to return text element for each property in the object thet is represented by the expression and element is made read only depending on the give input /// This SubtextboxFor is used to generate TextBox IDs fully compatible with ModelBinder when submitting a list of items. /// Note:it applys a readonly class to the element make sure you have a class named "readOnly" /// Also if you want to format you can use the System.ComponentModel.DataAnnotations.DataType and DisplayFormat to define the datatype and its format. /// </summary> /// <typeparam name="TModel"></typeparam> /// <typeparam name="TProperty"></typeparam> /// <param name="htmlHelper"></param> /// <param name="expression"></param> /// <param name="elementIndex"></param> /// <param name="htmlAttributes"></param> /// <param name="isReadOnly"></param> /// <returns></returns> /// <example> /// <code> /// <![CDATA[ consider Model is IEnumerable<Client> @for (int i = 0; i < Model.Products.Count(); i++) { @Html.SubTextBoxFor(modelItem => Model.Products.ElementAt.ProductDetailsID,i) } output textbox name is Client.Products[i].ProductDetailsID which allows modelbinder to bind it properly ]]> /// </code> /// </example> public static MvcHtmlString SubTextBoxFor<TModel,bool? isReadOnly = null) { var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); if (isReadOnly ?? false) { if (attrs.ContainsKey("class")) attrs["class"] = attrs["class"] + " readOnly"; else attrs.Add("class","readOnly"); attrs.Add("readonly","readonly"); } Func<TModel,TProperty> method = expression.Compile(); TProperty val = method(htmlHelper.ViewData.Model); var textboxName = ExpressionHelper.GetExpressionText(expression); textboxName = textboxName.Substring(textboxName.LastIndexOf('.') + 1); Regex r = new Regex(@"^.*?(.*).Model.(?<par1>.*?).ElementAt.*).(?<par2>.*?)$"); MatchCollection mcKVPs = r.Matches(expression.Body.Reduce().ToString()); var kvps = from Match m in mcKVPs where mcKVPs != null where mcKVPs.Count > 0 select new { val1 = m.Groups["par1"].Value,val2 = m.Groups["par2"].Value }; var kvp = kvps.FirstOrDefault(); var inputTag = new TagBuilder("input"); var metaData = ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData); var displayname = metaData.DisplayName.IsNull() ? textboxName : metaData.DisplayName; if (kvp.IsNotNull()) { inputTag.Attributes["id"] = kvp.val1 +"_"+ elementIndex +"_"+ kvp.val2; inputTag.Attributes["name"] = kvp.val1 + "[" + elementIndex + "]." + kvp.val2; } else { inputTag.Attributes["id"] = attrs["id"].IsNotNull() ? attrs["id"].ToString() : elementIndex + "_" + textboxName; inputTag.Attributes["name"] = attrs["name"].IsNotNull() ? attrs["name"].ToString() : "[" + elementIndex.ToString() + "]." + textboxName; } inputTag.Attributes["type"] = "text"; switch (metaData.DataTypeName) { case "Currency": inputTag.Attributes["value"] = val.IsNotNull() ? Convert.ToDouble(val).ToString(metaData.DisplayFormatString) : string.Empty; break; case "Date": case "DateTime": inputTag.Attributes["value"] = val.IsNotNull() ? val.ToDateTime().ToString(metaData.DisplayFormatString) : string.Empty; break; default: inputTag.Attributes["value"] = val.IsNotNull() ? val.ToString() : string.Empty; break; } inputTag.Attributes["value"] = val.IsNotNull() ? val.ToString() : ""; inputTag.MergeAttributes(attrs); return new MvcHtmlString(inputTag.ToString(TagRenderMode.Normal)); } 这适用于像Ids这样的隐藏字段 /// <summary> /// Custom helper to return input hidden element for each property in the object that is represented by the expression and element is made disabled depending on the give input /// This SubHiddenFor is used to generate hiddenfield IDs fully compatible with ModelBinder when submitting a list of items. /// </summary> /// <typeparam name="TModel"></typeparam> /// <typeparam name="TProperty"></typeparam> /// <param name="htmlHelper"></param> /// <param name="expression"></param> /// <param name="elementIndex"></param> /// <param name="htmlAttributes"></param> /// <returns></returns> public static MvcHtmlString SubHiddenFor<TModel,object htmlAttributes=null) { var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); Func<TModel,TProperty> method = expression.Compile(); TProperty val = method(htmlHelper.ViewData.Model); var hiddenfieldName = ExpressionHelper.GetExpressionText(expression); hiddenfieldName = hiddenfieldName.Substring(hiddenfieldName.LastIndexOf('.') + 1); Regex r = new Regex(@"^.*?(.*).Model.(?<par1>.*?).ElementAt.*).(?<par2>.*?)$"); MatchCollection mcKVPs = r.Matches(expression.Body.Reduce().ToString()); var kvps = from Match m in mcKVPs where mcKVPs != null where mcKVPs.Count > 0 select new { val1 = m.Groups["par1"].Value,htmlHelper.ViewData); var displayname = metaData.DisplayName.IsNull() ? hiddenfieldName : metaData.DisplayName; if (kvp.IsNotNull()) { inputTag.Attributes["id"] = kvp.val1 +"_"+ elementIndex +"_"+ kvp.val2; inputTag.Attributes["name"] = kvp.val1 + "[" + elementIndex + "]." + kvp.val2; } else { inputTag.Attributes["id"] = attrs["id"].IsNotNull() ? attrs["id"].ToString() : elementIndex+"_"+hiddenfieldName; inputTag.Attributes["name"] = attrs["name"].IsNotNull() ? attrs["name"].ToString() : "[" + elementIndex + "]." + hiddenfieldName; } inputTag.Attributes["type"] = "hidden"; inputTag.Attributes["value"] = val.ToCString(); inputTag.MergeAttributes(attrs); return new MvcHtmlString(inputTag.ToString(TagRenderMode.Normal)); } 这是复选框 /// <summary> /// Custom helper to return input type checkbox with a label element for each property in the object that is represented by the expression /// This SubCheckBoxWithLabel is used to generate input type checkboxes IDs fully compatible with ModelBinder when submitting a list of items. /// </summary> /// <typeparam name="TModel"></typeparam> /// <param name="htmlHelper"></param> /// <param name="expression"></param> /// <param name="elementIndex"></param> /// <param name="htmlLabelAttributes"></param> /// <param name="htmlCheckBoxAttributes"></param> /// <returns></returns> public static MvcHtmlString SubCheckBoxWithLabel<TModel>(this HtmlHelper<TModel> htmlHelper,bool>> expression,object htmlLabelAttributes = null,object htmlCheckBoxAttributes = null) { var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlCheckBoxAttributes); Func<TModel,bool> method = expression.Compile(); bool? val = method(htmlHelper.ViewData.Model); var chkattrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlCheckBoxAttributes); var checkboxName = ExpressionHelper.GetExpressionText(expression); var checkboxID = ExpressionHelper.GetExpressionText(expression); var hiddenTag = new TagBuilder("input"); checkboxName = checkboxName.Substring(checkboxName.LastIndexOf('.') + 1); var metadata = ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData); var displayname = metadata.DisplayName.IsNull() ? checkboxName : metadata.DisplayName; checkboxName = "[" + elementIndex + "]." + checkboxName; checkboxID = checkboxID.Replace('.','_') + "_" + elementIndex; Regex r = new Regex(@"^.*?(.*).Model.(?<par1>.*?).ElementAt.*).(?<par2>.*?)$"); MatchCollection mcKVPs = r.Matches(expression.Body.Reduce().ToString()); var kvps = from Match m in mcKVPs where mcKVPs != null where mcKVPs.Count > 0 select new { val1 = m.Groups["par1"].Value,val2 = m.Groups["par2"].Value }; var kvp = kvps.FirstOrDefault(); var labelTag = new TagBuilder("label"); var CheckboxTag = new TagBuilder("input"); if (kvp.IsNotNull()) { CheckboxTag.Attributes["id"] = "chk" + kvp.val1 + elementIndex + kvp.val2; CheckboxTag.Attributes["name"] = "chk" + kvp.val1 + "[" + elementIndex + "]." + kvp.val2; hiddenTag.Attributes["id"] = kvp.val1 + elementIndex + kvp.val2; hiddenTag.Attributes["name"] = kvp.val1 + "[" + elementIndex + "]." + kvp.val2; } else { CheckboxTag.Attributes["id"] = "chk" + (attrs["id"].IsNotNull() ? attrs["id"].ToString() : checkboxID); CheckboxTag.Attributes["name"] = "chk" + (attrs["name"].IsNotNull() ? attrs["name"].ToString() : checkboxName); hiddenTag.Attributes["id"] = attrs["id"].IsNotNull() ? attrs["id"].ToString() : checkboxID; hiddenTag.Attributes["name"] = attrs["name"].IsNotNull() ? attrs["name"].ToString() : checkboxName; } hiddenTag.Attributes["type"] = "hidden"; CheckboxTag.Attributes["type"] = "checkbox"; CheckboxTag.MergeAttribute("onclick","javascript: $(this).parent().next('#" + hiddenTag.Attributes["id"] + "').val($(this).is(':checked'));"); CheckboxTag.Attributes["value"] = val.ToString().ToLower(); hiddenTag.Attributes["value"] = val.ToString().ToLower(); if (val == true) { CheckboxTag.Attributes["checked"] = "checked"; } CheckboxTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlCheckBoxAttributes)); labelTag.AddCssClass("checkbox"); labelTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlLabelAttributes)); labelTag.InnerHtml = MvcHtmlString.Create(CheckboxTag.ToString(TagRenderMode.SelfClosing)) + " " + displayname; return new MvcHtmlString(labelTag.ToString() + hiddenTag.ToString(TagRenderMode.SelfClosing)); } 要使用它,你需要编码你的cshtml如下 @for (int i = 0; i < Model.Count(); i++) { <tr id="dvUser-@i"> <td> @Html.SubHiddenFor(modelItem=>Model.ElementAt(i).Id,i) @Html.SubTextBoxFor(modelItem => Model.ElementAt(i).UserName,i,new { @class="form-control" }) </td> <td> @Html.SubPasswordFor(modelItem => Model.ElementAt(i).NewPassword,new { @class="form-control" }) </td> <td> @Html.SubDropDownListFor(modelItem => Model.ElementAt(i).RoleId,(SelectList)ViewBag.Roles,"Select",new { @class = "form-control" }) </td> </tr> } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 为什么aspx文件返回404(“无法找到该页面”)
- asp.net下Cache 缓存操作类代码
- asp.net – 控制FormsAuthentication createPersistentCook
- asp.net-mvc – ASP.NET MVC HTML帮助程序可以渲染没有ID属
- asp.net核心 – 从OWIN迁移到ASP.NET核心
- asp.net – 如何以编程方式覆盖web.config设置
- ASP.NET CORE系列【七】分析NetCore启动原理
- asp.net-mvc-4 – @ Html.Raw坚持编码引号
- .NET Core容器化之多容器应用部署@Docker-Compose
- ASP.NET缓存方法分析和实践示例代码
推荐文章
站长推荐
- Asp.net mvc验证用户登录之Forms实现详解
- asp.net 禁用viewstate在web.config里
- asp.net-mvc – ASP.NET MVC请求处理序列
- 将ASP.NET updatepanel与jQuery UI DatePicker结
- 如何在ASP.NET中隐藏页面名称和查询字符串?
- asp.net-mvc – asp.net MVC Url.Content()CDN重
- asp.net-mvc – 支持Asp.NET MVC Razor的编辑器
- asp.net-mvc – 在cshtml中折叠C#块并保存
- asp.net – 使用SqlMetal和Visual Studio时自动生
- asp.net-core – 具有取消令牌的自定义AspCore中
热点阅读