using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace FastPostback.Models
{
public class ModelBinder
{
public static void BindControls<T>(Control control, T entity) where T : class
{
var properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (PropertyInfo prop in properties)
{
Control ctrl = control.FindControl(prop.Name);
if (ctrl == null)
continue;
string s = ctrl.GetType().ToString();
switch (ctrl.GetType().ToString())
{
case "System.Web.UI.WebControls.TextBox":
((TextBox)ctrl).Text = GetData(entity, prop.Name);
break;
case "System.Web.UI.WebControls.DropDownList":
((DropDownList)ctrl).SelectedValue = GetData(entity, prop.Name);
break;
case "System.Web.UI.WebControls.HiddenField":
((HiddenField)ctrl).Value = GetData(entity, prop.Name);
break;
}
}
}
public static T Bind<T>()
{
NameValueCollection formData = PrepareData(HttpContext.Current.Request.Form);
var properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);
var instance = (T)Activator.CreateInstance(typeof(T));
BindEntity(instance, properties, formData);
return instance;
}
public static void BindEntity(object obj)
{
if (obj == null)
return;
NameValueCollection formData = PrepareData(HttpContext.Current.Request.Form);
var properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
var instance = obj;
var instanceType = instance.GetType();
//var raiseError = RaiseError(instanceType);
BindEntity(obj, properties, formData);
}
private static void BindEntity(object obj, IEnumerable<PropertyInfo> props, NameValueCollection data)
{
foreach (PropertyInfo prop in props)
{
if (!string.IsNullOrEmpty(data[prop.Name]))
SetValue(obj, prop.Name, data[prop.Name]);
}
}
public static void SetValue(object inputObject, string propertyName, object propertyVal)
{
//find out the type
Type type = inputObject.GetType();
//get the property information based on the type
System.Reflection.PropertyInfo propertyInfo = type.GetProperty(propertyName);
//find the property type
Type propertyType = propertyInfo.PropertyType;
//Convert.ChangeType does not handle conversion to nullable types
//if the property type is nullable, we need to get the underlying type of the property
var targetType = IsNullableType(propertyInfo.PropertyType) ? Nullable.GetUnderlyingType(propertyInfo.PropertyType) : propertyInfo.PropertyType;
//Returns an System.Object with the specified System.Type and whose value is
//equivalent to the specified object.
propertyVal = Convert.ChangeType(propertyVal, targetType);
//Set the value of the property
propertyInfo.SetValue(inputObject, propertyVal, null);
}
private static bool IsNullableType(Type type)
{
return type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
}
private static string GetData<T>(T item, string col) where T : class
{
return Convert.ToString(item.GetType().GetProperty(col).GetValue(item, null));
}
private static NameValueCollection PrepareData(NameValueCollection data)
{
NameValueCollection list = new NameValueCollection();
foreach (string key in data.AllKeys)
{
string newKey = key.Substring(key.LastIndexOf('$') + 1);
list.Add(newKey, data[key]);
}
return list;
}
}
}