C# 为IEnumerable创建HiddenFor<;字符串>;鉴于
我有一个属性是IEnumerableC# 为IEnumerable创建HiddenFor<;字符串>;鉴于,c#,asp.net-mvc,asp.net-mvc-3,linq,entity,C#,Asp.net Mvc,Asp.net Mvc 3,Linq,Entity,我有一个属性是IEnumerable public IEnumerable<string> ChangesOthersResult { get; set; } 正在将原始SQL语句作为文本提供给我 在模型的构造函数中,新建IEnumerable ChagesOthersResult public Model () { ChangesOthersResult = new List<string>(); } 公共模型() { ChangesOthersResult=新
public IEnumerable<string> ChangesOthersResult { get; set; }
正在将原始SQL语句作为文本提供给我 在模型的构造函数中,新建IEnumerable ChagesOthersResult
public Model ()
{
ChangesOthersResult = new List<string>();
}
公共模型()
{
ChangesOthersResult=新列表();
}
然后在视图中,使用for循环
for(int i = 0; i < Model.ChangesOthersResult.Count; i++)
{
@Html.HiddenFor(x => x.ChangesOthersResult[i])
}
for(int i=0;ix.ChangesOthersResult[i])
}
将ChangeSotherResult转换为数组,并使用for循环输出如下内容:
for (int i = 0; i < Model.ChangesOthersResult.Length; i++ )
{
@Html.Hidden("ChangesOthersResult[" + i + "]", Model.ChangesOthersResult[i])
}
for(int i=0;i
我将其制作成一个扩展方法,这样for循环就不会丑化您的视图代码:
public static class HiddenExtensions
{
public static MvcHtmlString HiddenForEnumerable<TModel, TProperty>(this HtmlHelper<TModel> helper,
Expression<Func<TModel, IEnumerable<TProperty>>> expression)
{
var sb = new StringBuilder();
var membername = expression.GetMemberName();
var model = helper.ViewData.Model;
var list = expression.Compile()(model);
for (var i = 0; i < list.Count(); i++)
{
sb.Append(helper.Hidden(string.Format("{0}[{1}]", membername, i), list.ElementAt(i)));
}
return new MvcHtmlString(sb.ToString());
}
}
公共静态类HiddenExtensions
{
公共静态MvcHtmlString HiddenForEnumerable(此HtmlHelper,
表达式(表达式)
{
var sb=新的StringBuilder();
var membername=expression.GetMemberName();
var model=helper.ViewData.model;
var list=expression.Compile()(模型);
对于(var i=0;i
GetMemberName是另一个扩展方法:
public static string GetMemberName<TModel, T>(this Expression<Func<TModel, T>> input)
{
if (input == null)
return null;
if (input.Body.NodeType != ExpressionType.MemberAccess)
return null;
var memberExp = input.Body as MemberExpression;
return memberExp != null ? memberExp.Member.Name : null;
}
公共静态字符串GetMemberName(此表达式输入)
{
如果(输入==null)
返回null;
if(input.Body.NodeType!=ExpressionType.MemberAccess)
返回null;
var memberExp=input.Body作为MemberExpression;
return memberExp!=null?memberExp.Member.Name:null;
}
希望这是有帮助的 无法使用.ForEach(),因为@Html.HiddenFor(x=>x.changeSotherResult)将创建相同的元素ID,模型在回发时无法识别该ID
for (int i = 0; i < Model.ChangesOthersResult.Count(); i++ )
{
@Html.HiddenFor(x => x.ChangesOthersResult[I]);
}
for(int i=0;ix.ChangesOthersResult[I]);
}
针对自定义对象列表的扩展@GitteTitter解决方案:
@Html.HiddenForEnumerable(x => x.ValueTypes)
@Html.HiddenForEnumerable(x => x.ViewModels, h=>h.Id, h=>h.Name)
@Html.HiddenForEnumerable(x => x.ViewModels, allPublicProps: true)
资料来源:
/// <summary>
/// Returns hiddens for every IEnumerable item, with it's selected properties, if any memberPropsExpression provided.
/// </summary>
public static MvcHtmlString HiddenForEnumerable<TModel, TModelProperty>(this HtmlHelper<TModel> helper,
Expression<Func<TModel, IEnumerable<TModelProperty>>> expression, params Expression<Func<TModelProperty, object>>[] memberPropsExpressions)
{
var sb = new StringBuilder();
var membername = expression.GetMemberName();
var model = helper.ViewData.Model;
var list = expression.Compile()(model);
var memPropsInfo = memberPropsExpressions.Select(x => new
{
MemberPropName = x.GetMemberName(),
ListItemPropGetter = x.Compile()
}).ToList();
for (var i = 0; i < list.Count(); i++)
{
var listItem = list.ElementAt(i);
if (memPropsInfo.Any())
{
foreach (var q in memPropsInfo)
{
sb.Append(helper.Hidden(string.Format("{0}[{1}].{2}", membername, i, q.MemberPropName), q.ListItemPropGetter(listItem)));
}
}
else
{
sb.Append(helper.Hidden(string.Format("{0}[{1}]", membername, i), listItem));
}
}
return new MvcHtmlString(sb.ToString());
}
/// <summary>
/// Returns hiddens for every IEnumerable item, with it's all public writable properties, if allPublicProps set to true.
/// </summary>
public static MvcHtmlString HiddenForEnumerable<TModel, TModelProperty>(this HtmlHelper<TModel> helper,
Expression<Func<TModel, IEnumerable<TModelProperty>>> expression, bool allPublicProps)
{
if (!allPublicProps)
return HiddenForEnumerable(helper, expression);
var sb = new StringBuilder();
var membername = expression.GetMemberName();
var model = helper.ViewData.Model;
var list = expression.Compile()(model);
var type = typeof(TModelProperty);
var memPropsInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.GetSetMethod(false) != null && x.GetGetMethod(false) != null)
.Select(x => new
{
MemberPropName = x.Name,
ListItemPropGetter = (Func<TModelProperty, object>)(p => x.GetValue(p, null))
}).ToList();
if (memPropsInfo.Count == 0)
return HiddenForEnumerable(helper, expression);
for (var i = 0; i < list.Count(); i++)
{
var listItem = list.ElementAt(i);
foreach (var q in memPropsInfo)
{
sb.Append(helper.Hidden(string.Format("{0}[{1}].{2}", membername, i, q.MemberPropName), q.ListItemPropGetter(listItem)));
}
}
return new MvcHtmlString(sb.ToString());
}
public static string GetMemberName<TModel, T>(this Expression<Func<TModel, T>> input)
{
if (input == null)
return null;
MemberExpression memberExp = null;
if (input.Body.NodeType == ExpressionType.MemberAccess)
memberExp = input.Body as MemberExpression;
else if (input.Body.NodeType == ExpressionType.Convert)
memberExp = ((UnaryExpression)input.Body).Operand as MemberExpression;
return memberExp != null ? memberExp.Member.Name : null;
}
//
///返回每个IEnumerable项的隐藏项及其所选属性(如果提供了MemberPropsePression)。
///
公共静态MvcHtmlString HiddenForEnumerable(此HtmlHelper,
表达式表达式,参数表达式[]成员属性表达式)
{
var sb=新的StringBuilder();
var membername=expression.GetMemberName();
var model=helper.ViewData.model;
var list=expression.Compile()(模型);
var memPropsInfo=memberPropsExpressions。选择(x=>new
{
MemberPropName=x.GetMemberName(),
ListItemPropGetter=x.Compile()
}).ToList();
对于(var i=0;ix.GetSetMethod(false)!=null&&x.GetGetMethod(false)!=null)
.选择(x=>new
{
MemberPropName=x.Name,
ListItemPropGetter=(Func)(p=>x.GetValue(p,null))
}).ToList();
if(memPropsInfo.Count==0)
返回HiddenForEnumerable(helper,expression);
对于(var i=0;i
递归方法怎么样
public static MvcHtmlString HiddenForEnumerable<TModel, TModelProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, IEnumerable<TModelProperty>>> expression, string prefix = null)
{
var sb = new StringBuilder();
var membername = expression.GetMemberName();
var model = htmlHelper.ViewData.Model;
var list = expression.Compile()(model);
var type = typeof(TModelProperty);
var memPropertyInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.GetSetMethod(false) != null && x.GetGetMethod(false) != null)
.Select(x => new
{
Type = x.PropertyType,
x.Name,
Get = (Func<TModelProperty, object>)(p => x.GetValue(p, null))
}).ToList();
for (var i = 0; i < list.Count(); i++)
{
var listItem = list.ElementAt(i);
if (memPropertyInfo.Any())
{
foreach (var m in memPropertyInfo)
{
var inputName = $"{prefix ?? ""}{membername}[{i}].{m.Name}";
var inputValue = m.Get(listItem);
var genericArguments = m.Type.GetGenericArguments();
if (genericArguments.Any() && IsEnumerableType(m.Type))
{
var delegateType = typeof(Func<,>).MakeGenericType(typeof(TModel), m.Type);
var bodyExpression = Expression.Constant(inputValue, m.Type);
var paramExpression = Expression.Parameter(typeof(TModel), "model");
var expressionTree = Expression.Lambda(delegateType, bodyExpression, new[] { paramExpression });
var hiddenForEnumerableInfo = typeof(HtmlHelpers).GetMethod("HiddenForEnumerable");
var hiddenForEnumerable = hiddenForEnumerableInfo.MakeGenericMethod(typeof(TModel), genericArguments[0]);
object[] args = { htmlHelper, expressionTree, inputName };
sb.Append(hiddenForEnumerable.Invoke(null, args));
}
else
{
sb.Append(htmlHelper.Hidden(inputName, inputValue));
}
}
}
else
{
sb.Append(htmlHelper.Hidden($"{membername}[{i}]", listItem));
}
}
return new MvcHtmlString(sb.ToString());
}
private static string GetMemberName<TModel, T>(this Expression<Func<TModel, T>> input)
{
if (input == null)
return null;
MemberExpression memberExp = null;
if (input.Body.NodeType == ExpressionType.MemberAccess)
memberExp = input.Body as MemberExpression;
else if (input.Body.NodeType == ExpressionType.Convert)
memberExp = ((UnaryExpression)input.Body).Operand as MemberExpression;
return memberExp?.Member.Name;
}
private static bool IsEnumerableType(Type type)
{
return (type.GetInterface("IEnumerable") != null);
}
输出:
<input id="Orders_0__OrderId" name="Orders[0].OrderId" type="hidden" value="1001">
<input id="Orders_0__Items_0__ItemId" name="Orders[0].Items[0].ItemId" type="hidden" value="201">
<input id="Orders_0__Items_0__Name" name="Orders[0].Items[0].Name" type="hidden" value="Something1">
<input id="Orders_0__Items_1__ItemId" name="Orders[0].Items[1].ItemId" type="hidden" value="202">
<input id="Orders_0__Items_1__Name" name="Orders[0].Items[1].Name" type="hidden" value="Something2">
<input id="Orders_1__OrderId" name="Orders[1].OrderId" type="hidden" value="1002">
<input id="Orders_1__Items_0__ItemId" name="Orders[1].Items[0].ItemId" type="hidden" value="205">
<input id="Orders_1__Items_0__Name" name="Orders[1].Items[0].Name" type="hidden" value="Something5">
对于aspnetcore也一样
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
namespace Proj.Helpers
{
public static class HtmlHelpers
{
public static IHtmlContent HiddenForEnumerable<TModel, TModelProperty>(this IHtmlHelper<TModel> helper,
Expression<Func<TModel, IEnumerable<TModelProperty>>> expression, params Expression<Func<TModelProperty, object>>[] memberPropsExpressions)
{
var hcb = new HtmlContentBuilder();
var membername = expression.GetMemberName();
var model = helper.ViewData.Model;
var list = expression.Compile()(model);
var memPropsInfo = memberPropsExpressions.Select(x => new
{
MemberPropName = x.GetMemberName(),
ListItemPropGetter = x.Compile()
}).ToList();
for (var i = 0; i < list.Count(); i++)
{
var listItem = list.ElementAt(i);
if (memPropsInfo.Any())
{
foreach (var q in memPropsInfo)
{
hcb.AppendHtml(helper.Hidden(string.Format("{0}[{1}].{2}", membername, i, q.MemberPropName), q.ListItemPropGetter(listItem)));
}
}
else
{
hcb.AppendHtml(helper.Hidden(string.Format("{0}[{1}]", membername, i), listItem));
}
}
return hcb;
}
/// <summary>
/// Returns hiddens for every IEnumerable item, with it's all public writable properties, if allPublicProps set to true.
/// </summary>
public static IHtmlContent HiddenForEnumerable<TModel, TModelProperty>(this IHtmlHelper<TModel> helper,
Expression<Func<TModel, IEnumerable<TModelProperty>>> expression, bool allPublicProps)
{
if (!allPublicProps)
return HiddenForEnumerable(helper, expression);
var hcb = new HtmlContentBuilder();
var membername = expression.GetMemberName();
var model = helper.ViewData.Model;
var list = expression.Compile()(model);
var type = typeof(TModelProperty);
var memPropsInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.GetSetMethod(false) != null && x.GetGetMethod(false) != null)
.Select(x => new
{
MemberPropName = x.Name,
ListItemPropGetter = (Func<TModelProperty, object>)(p => x.GetValue(p, null))
}).ToList();
if (memPropsInfo.Count == 0)
return HiddenForEnumerable(helper, expression);
for (var i = 0; i < list.Count(); i++)
{
var listItem = list.ElementAt(i);
foreach (var q in memPropsInfo)
{
hcb.AppendHtml(helper.Hidden(string.Format("{0}[{1}].{2}", membername, i, q.MemberPropName), q.ListItemPropGetter(listItem)));
}
}
return hcb;
}
public static string GetMemberName<TModel, T>(this Expression<Func<TModel, T>> input)
{
if (input == null)
return null;
MemberExpression memberExp = null;
if (input.Body.NodeType == ExpressionType.MemberAccess)
memberExp = input.Body as MemberExpression;
else if (input.Body.NodeType == ExpressionType.Convert)
memberExp = ((UnaryExpression)input.Body).Operand as MemberExpression;
return memberExp != null ? memberExp.Member.Name : null;
}
}
}
使用Microsoft.AspNetCore.Html;
使用Microsoft.AspNetCore.Mvc.Rendering;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用System.Linq.Expressions;
运用系统反思;
使用系统文本;
命名空间项目帮助程序
{
公共静态类HtmlHelpers
{
公共静态IHTML内容隐藏不可计算(此IHTML帮助程序,
表达式表达式,参数表达式[]成员属性表达式)
{
var hcb=新的HtmlContentBuilder();
var membername=expression.GetMemberName();
var model=helper.ViewData.model;
var list=expression.Compile()(模型);
var memPropsInfo=memberPropsExpressions。选择(x=>new
{
MemberPropName=x.GetMemberName(),
@Html.HiddenForEnumerable(model => model.Orders)
<input id="Orders_0__OrderId" name="Orders[0].OrderId" type="hidden" value="1001">
<input id="Orders_0__Items_0__ItemId" name="Orders[0].Items[0].ItemId" type="hidden" value="201">
<input id="Orders_0__Items_0__Name" name="Orders[0].Items[0].Name" type="hidden" value="Something1">
<input id="Orders_0__Items_1__ItemId" name="Orders[0].Items[1].ItemId" type="hidden" value="202">
<input id="Orders_0__Items_1__Name" name="Orders[0].Items[1].Name" type="hidden" value="Something2">
<input id="Orders_1__OrderId" name="Orders[1].OrderId" type="hidden" value="1002">
<input id="Orders_1__Items_0__ItemId" name="Orders[1].Items[0].ItemId" type="hidden" value="205">
<input id="Orders_1__Items_0__Name" name="Orders[1].Items[0].Name" type="hidden" value="Something5">
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
namespace Proj.Helpers
{
public static class HtmlHelpers
{
public static IHtmlContent HiddenForEnumerable<TModel, TModelProperty>(this IHtmlHelper<TModel> helper,
Expression<Func<TModel, IEnumerable<TModelProperty>>> expression, params Expression<Func<TModelProperty, object>>[] memberPropsExpressions)
{
var hcb = new HtmlContentBuilder();
var membername = expression.GetMemberName();
var model = helper.ViewData.Model;
var list = expression.Compile()(model);
var memPropsInfo = memberPropsExpressions.Select(x => new
{
MemberPropName = x.GetMemberName(),
ListItemPropGetter = x.Compile()
}).ToList();
for (var i = 0; i < list.Count(); i++)
{
var listItem = list.ElementAt(i);
if (memPropsInfo.Any())
{
foreach (var q in memPropsInfo)
{
hcb.AppendHtml(helper.Hidden(string.Format("{0}[{1}].{2}", membername, i, q.MemberPropName), q.ListItemPropGetter(listItem)));
}
}
else
{
hcb.AppendHtml(helper.Hidden(string.Format("{0}[{1}]", membername, i), listItem));
}
}
return hcb;
}
/// <summary>
/// Returns hiddens for every IEnumerable item, with it's all public writable properties, if allPublicProps set to true.
/// </summary>
public static IHtmlContent HiddenForEnumerable<TModel, TModelProperty>(this IHtmlHelper<TModel> helper,
Expression<Func<TModel, IEnumerable<TModelProperty>>> expression, bool allPublicProps)
{
if (!allPublicProps)
return HiddenForEnumerable(helper, expression);
var hcb = new HtmlContentBuilder();
var membername = expression.GetMemberName();
var model = helper.ViewData.Model;
var list = expression.Compile()(model);
var type = typeof(TModelProperty);
var memPropsInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.GetSetMethod(false) != null && x.GetGetMethod(false) != null)
.Select(x => new
{
MemberPropName = x.Name,
ListItemPropGetter = (Func<TModelProperty, object>)(p => x.GetValue(p, null))
}).ToList();
if (memPropsInfo.Count == 0)
return HiddenForEnumerable(helper, expression);
for (var i = 0; i < list.Count(); i++)
{
var listItem = list.ElementAt(i);
foreach (var q in memPropsInfo)
{
hcb.AppendHtml(helper.Hidden(string.Format("{0}[{1}].{2}", membername, i, q.MemberPropName), q.ListItemPropGetter(listItem)));
}
}
return hcb;
}
public static string GetMemberName<TModel, T>(this Expression<Func<TModel, T>> input)
{
if (input == null)
return null;
MemberExpression memberExp = null;
if (input.Body.NodeType == ExpressionType.MemberAccess)
memberExp = input.Body as MemberExpression;
else if (input.Body.NodeType == ExpressionType.Convert)
memberExp = ((UnaryExpression)input.Body).Operand as MemberExpression;
return memberExp != null ? memberExp.Member.Name : null;
}
}
}