[MVC]透過ActionFilterAttribute包裝共用的參數

[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:從零開始的軟體開發生活

請大家繼續支持 ^_^