[MVC]透過ActionFilterAttribute包裝共用的參數
環境
Ext JS 4, ASP.NET MVC 3
說明
筆者使用ExtJs 4 + Asp.NET MVC,在使用Ext Grid做分頁及Sort,會傳給Controller如下的資訊,
start(開始取位置,一開始為0)
limit(pageSize)
sort(排序的資訊,內容為property表示排序的欄位[{"property":"EmpId","direction":"ASC"}])
所以Controller中Method可能會如下,
public JsonResult GetEmpList(int start, int limit, string sort)
{
....取資料...
}
參數有3個,所以我們可以將這3個參數改用ActionFilterAttribute包裝起來,Method就會如下,
[ExtGridActionAttribute()]
public JsonResult GetEmpList(ExtGridCommand command)
{
....取資料...
}
實作
所以我們就可以透過ActionFilterAttribute把這些參數包成ExtGridCommand,這樣就不用每個給Grid使用的Controller Method都加那3個參數,而使用一致的方式來處理。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Runtime.Serialization.Json;
using System.Xml.Serialization;
using System.Xml.Linq;
using System.IO;
using System.Text;
using MVC3Ext4.Models;
namespace MVC3Ext4.ActionFilter
{
public class ExtGridActionAttribute : ActionFilterAttribute
{
public ExtGridActionAttribute()
{
ActionParameterName = "command";
}
public string ActionParameterName
{
get;
set;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//包裝EXT JS的GRID分頁屬性
if (filterContext.ActionParameters.ContainsKey(ActionParameterName))
{
ExtGridCommand command = new ExtGridCommand
{
start = int.Parse(filterContext.HttpContext.Request.QueryString["start"]),
limit = int.Parse(filterContext.HttpContext.Request.QueryString["limit"])
};
string paraValue = filterContext.HttpContext.Request.QueryString["sort"];
if (string.IsNullOrEmpty(paraValue) == false)
{
//EXTJS 4.0的SORT內容為 [{"property":"EmpId","direction":"ASC"}]
MemoryStream msmdl = new MemoryStream(Encoding.Unicode.GetBytes(paraValue.Replace("[", "")
.Replace("]", "")));
command.sortInfo = (new DataContractJsonSerializer(typeof(SortInfo))
.ReadObject(msmdl)) as SortInfo;
}
filterContext.ActionParameters[ActionParameterName] = command;
}
}
}
}
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^