[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:從零開始的軟體開發生活」
請大家繼續支持 ^_^

