扩展数据绑定到IList的功能
场景:
框架很方便就能把以上场所提交的数据绑定到一个IList<T>的成员对象中。
定义描述:
[NClay.MVC.Action("~/Default.aspx", typeof(IImportUsers))]
public class Default:IImportUsers
{
#region IImportUsers 成员
private IList<User> mUsers;
[NClay.MVC.Binder.Converter(typeof(UsersBind))]
public IList<User> Users
{
get
{
return mUsers;
}
set
{
mUsers = value;
}
}
#endregion
}
public class UsersBind : IListConverter<User>
{
protected override string Prefix
{
get
{
return "user";
}
}
}
扩展代码:
public abstract class IListConverter<T> : NClay.MVC.Binder.IStringConverter where T : new()
{
#region IStringConverter 成员
protected abstract string Prefix
{
get;
}
static object mLockObject = new object();
private static NClay.PropertyHandler[] mPHandlers;
protected static NClay.PropertyHandler[] PHandlers
{
get
{
if (mPHandlers == null)
{
lock (mLockObject)
{
CreateHandlers();
}
}
return mPHandlers;
}
}
static void CreateHandlers()
{
if (mPHandlers == null)
{
PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);
mPHandlers = new NClay.PropertyHandler[properties.Length];
for (int i = 0; i < properties.Length; i++)
{
mPHandlers[i] = new NClay.PropertyHandler(properties[i]);
}
}
}
public object ConvertTo(string value, out bool succeeded)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Reset();
sw.Start();
HttpRequest request = HttpContext.Current.Request;
int recordcount = 0;
string[] values;
T item;
IList<T> items = new List<T>();
Dictionary<NClay.PropertyHandler, string[]> propertyvalues = new Dictionary<NClay.PropertyHandler, string[]>();
NClay.MVC.Binder.IStringConverter pconverter;
bool iscomplete;
object pvalue;
foreach (NClay.PropertyHandler pinfo in PHandlers)
{
values = GetPropertyValue(request, pinfo.Property.Name);
if (values != null)
{
if (values.Length > recordcount)
recordcount = values.Length;
}
propertyvalues.Add(pinfo, values);
}
for (int i = 0; i < recordcount; i++)
{
item = new T();
foreach (NClay.PropertyHandler pinfo in PHandlers)
{
values = propertyvalues[pinfo];
if (values != null)
{
pconverter = NClay.MVC.Binder.ConverterFactory.Converters[pinfo.Property.PropertyType];
if (pconverter != null)
{
if (i < values.Length)
{
pvalue = pconverter.ConvertTo(values[i], out iscomplete);
if (iscomplete)
pinfo.Set(item, pvalue);
}
}
}
}
items.Add(item);
}
succeeded = true;
sw.Stop();
HttpContext.Current.Response.Write("绑定耗时:"+sw.Elapsed.TotalMilliseconds+"毫秒");
return items;
}
private string[] GetPropertyValue(HttpRequest request, string name)
{
string[] values = null;
values=request.Params.GetValues(Prefix + "." + name);
if(NClay.Common.IsEmpty(values))
values = request.Params.GetValues(Prefix + name);
if (NClay.Common.IsEmpty(values))
values = request.Params.GetValues(Prefix + "_" + name);
return values;
}
#endregion