2009-06-16 27 views
1

私はASP.NET MVCのプレビュー2日間に誕生したアプリケーションで作業しています。場所はかなり汚れていて、私はそれをきれいにしようとしています。私が克服しようとしている問題の1つは、過度に冗長なコードです。ASP.NET MVCでアクションごとのパラメータのデフォルトを設定するにはどうすればよいですか?

たとえば、私は、これとまったく同じように見えるが、デフォルトのソートパラメータが異なるたくさんのメソッドがあります。ページおよびページサイズのデフォルト値は、アプリ全体で変更されません。今

public ActionResult List(int? page, int? pagesize, string sortby, string sortorder) 
{ 
    if (string.IsNullOrEmpty(sortby)) 
     sortby = "ClientInvoiceNumber"; 
    if (string.IsNullOrEmpty(sortorder)) 
     sortorder = "desc"; 
    page = page ?? 1; 
    pagesize = pagesize ?? 10; 

    ... 

    return View(); 
} 

理想的には、C#が、このようなものをサポートします:

public ActionResult List(int page = 1, int pagesize = 10, string sortby = "ClientInvoiceNumber", string sortorder = "desc") 

をしかし、もちろん、これはそうではありません。

正確にASP.NET MVCでは、ルート単位ではなく、アクション単位でデフォルトパラメータを設定するコードを記述していますか?誰かがこの問題をきれいに解決したのですか、それとも私が気付いていないフレームワークに焼かれたものがありますか?可能であれば、デフォルトのパラメータをHttpRequestBaseパラメータコレクションに追加したいと思います。

私はこれについていくつか考えましたが、回答を人為的に特定の方向に誘導しないように自由に質問を残したいと思います。私はルート定義でデフォルトを設定できることを認識していますが、10億のルートを作成することなく、アクションごとのデフォルトを設定したいと思います。

+0

ControllerActionInvokerをサブクラス化し、GetParameterValue()メソッドをオーバーライドする必要があります。 [DefaultValue]のサポートをフレームワークの次のバージョンに追加するというオープンな要求がありますが、実際に実装されるかどうかについては誰も約束できません。 – Levi

答えて

4

は、カスタムフィルタを試してみましたルートテーブルにルートを追加しながらこれを行うことができます:

[Defaults(new {"page", "pagesize", "sortby", "sortorder"}, new {1, 10, "ClientInvoiceNumber", "desc"})] 
public ActionResult List(int page, int pagesize, string sortby, string sortorder) { 
    ... 
} 
0

あなたは、これが(残念ながらCLRは、属性の動的パラメータを使用できません)、それを使用して

public class DefaultsAttribute : ActionFilterAttribute 
{ 
    public string[] DefaultParams; 
    public object[] DefaultValues; 

    public DefaultsAttribute(string[] defaultParams, object[] defaultValues) 
    { 
     DefaultParams = defaultParams; 
     DefaultValues = defaultValues; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var params = filterContext.ActionParameters; 

     for(int i = 0; i < DefaultParams.Length; i++) 
     { 
      if (params.Keys.Any(x => x == DefaultParams[i])) 
      { 
       params[DefaultParams[i]] = DefaultValues[i]; 
      } 
     } 
    } 
} 

を?:ため

routes.MapRoute(
       "<RouteName>", 
       "path/to/action{parameter1}", 
       new{controller = "<controller name>", action = "<action name>", 
        parameter1= <default value>}); 
+0

私が言ったように、私はこれを認識していますが、私はちょっと変わるデフォルトのパラメータを設定するだけで、List()アクションごとに10億のルートを作成する必要はありません。 –

関連する問題