今天封装了一个工具类,具体作用是将Request传递过来的参数放到Dictionary中,可以对参数进行优化,也可以减少大量的重复代码。
从java转到C#的我,最初最难受的就是从页面传值到控制器中时,无法获取装到一个类“Map”的集合框架中。在java中,直接有api帮我们做这件事:Request.parameterMap();而C#做MVC时,并没有这个api,只能用Request.Parameter[key];这样就造成了大量的重复代码;且c#在各层进行参数传递时,有时参数列表很长,同一个对象的参数还好说,可以封装到一个Objet中,若参数来自不同的对象中呢?这时候就很麻烦了。
这里也可以通过这个解决。有没有可能对其进行封装,并加以优化呢。这里推出一个工具类,PageData。
PagaData:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace SAM.Common
{
public class PageData:Dictionary<object,object>,IDictionary<object,object>
{
IDictionary<object, object> dictionary = null;
HttpRequestBase request = null;
public PageData(HttpRequestBase request) {
this.request = request;
Dictionary<object, object> returnDictory = new Dictionary<object, object>();
string[] keys = request.Form.AllKeys; //Set
if(keys.Count() == 0)
{
keys = request.QueryString.AllKeys; //Get
}
foreach(string name in keys){
string value = request.Params[name].ToString().Trim();
returnDictory.Add(name,value);
}
dictionary = returnDictory;
}
public PageData()
{
dictionary = new Dictionary<object, object>();
}
public Object Get(object key)
{
return dictionary[key];
}
//public DateTime GetDateTime(object key) {
// if (key != null)
// {
// return Utility.ConvertToDatetime(dictionary[key]);
// }
// else
// {
// return DateTime.Now;
// }
//}
//public Int32 GetInt32(object key)
//{
// return Utility.ConvertToInt32(dictionary[key]);
//}
public Object this[object key] {
get { return dictionary[key]; }
set { }
}
public void Add(object key, object value)
{
dictionary.Add(key,value);
}
public bool ContainsKey(object key)
{
return dictionary.ContainsKey(key);
}
public ICollection<object> Keys
{
get { return dictionary.Keys; }
}
public bool Remove(object key)
{
return dictionary.Remove(key);
}
public ICollection<object> Values
{
get { return dictionary.Values; }
}
public void Add(KeyValuePair<object, object> item)
{
dictionary.Add(item);
}
public void Clear()
{
dictionary.Clear();
}
public bool Contains(KeyValuePair<object, object> item)
{
return dictionary.Contains(item);
}
public void CopyTo(KeyValuePair<object, object>[] array, int arrayIndex)
{
dictionary.CopyTo(array,arrayIndex);
}
public int Count
{
get { return dictionary.Count; }
}
public bool IsReadOnly
{
get { return dictionary.IsReadOnly; }
}
public bool Remove(KeyValuePair<object, object> item)
{
return dictionary.Remove(item);
}
public IEnumerator<KeyValuePair<object, object>> GetEnumerator()
{
return dictionary.GetEnumerator();
}
}
}
这里有两个构造函数,第一个就是你在action中,通过Request,获取到页面传递的数据。第二个就是你可以把PagaData当做一个Dictionary类来使用。
在action如何调用呢?
你可以在你的BaseController中,添加一个Get方法。然后用Conntroller继承BaseController,这个BaseController还可以做其他操作,例如Session的检查,异常信息的捕获,日志信息等。
BaseController:
using SAM.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace SAM.Web.Controllers
{
public class BaseController : Controller
{
//
// GET: /Base/
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
string errorMessage = LogHelper.RecordError(filterContext.Exception);
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Redirect("/Login/ErrorPage?msg=" + errorMessage);//跳转至错误提示页面
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (Session[SessionKey.USER_MASTER] == null || Session[SessionKey.COMPANY_INFORMATION] == null)
{
Response.Redirect("/Login/ReLogin");
}
}
public PageData GetPageData()
{
return new PageData(this.Request);
}
}
}
调用:
Controller:
PageData pd = this.GetPageData();