2011-06-10 27 views
1

我想作以下asp.net的MVC路線:如何使用兩個可選參數來設置一個asp.net mvc路由,一個是參數值?

http://somedomain.com/user/search/500?Users=1,2,3,4 
http://somedomain.com/user/search/500 
http://somedomain.com/user/search?Users=1,2,3,4 
http://somedomain.com/user/search 

用戶將匹配到控制器,搜索將匹配的操作方法。可選參數500將與您在動作方法中猜想它是一個可選參數相匹配。用戶的可選查詢字符串將匹配操作方法中的可選數組參數。

將這些設置起來的最佳方法是什麼?一個自定義的ActionFilterAttribute?兩種不同的行動方法?我的routescollection中有多個路由條目?

任何信息將不勝感激。

回答

0

我最終創建了一個自定義的actionfilterattribute,它將來自請求的查詢字符串用戶轉換爲一個長整型列表,然後將其放入一個actionparameter。 500的參數在路線和動作方法中都設置爲可選。

3

我將定義以下路線:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{someparam}", 
    new { controller = "Users", action = "Search", id = UrlParameter.Optional } 
); 

,然後寫爲一個字符串數組的自定義模型粘合劑:

public class StringArrayModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (value != null) 
     { 
      return value.AttemptedValue.Split(','); 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

最後我會有這樣定義的控制器動作:

public ActionResult Search(
    [ModelBinder(typeof(StringArrayModelBinder))] string[] users, 
    string someparam 
) 
{ 
    ... 
} 

如果您希望將此自定義模型聯編程序應用於所有具有字符串作爲操作參數的數組,你可以在Application_Start聲明它:

ModelBinders.Binders.Add(typeof(string[]), new StringArrayModelBinder()); 

,然後你的控制器動作,都只是:

public ActionResult Search(string[] users, string someparam) 
{ 
    ... 
} 
相關問題