2012-02-14 89 views
3

我正在開發具有動態數量的複選框和價格範圍的搜索。我需要的映射是這樣的路線:MVC 3搜索路線

/過濾/屬性/ ATTRIBUTE1,Attribute2,Attribute3 /價格/ 1000-2000

這是做一個好辦法嗎?我怎樣才能做到這一點?

回答

4
routes.MapRoute(
    "FilterRoute", 
    "filter/attributes/{attributes}/price/{pricerange}", 
    new { controller = "Filter", action = "Index" } 
); 

,並在你的索引操作:

public class FilterController: Controller 
{ 
    public ActionResult Index(FilterViewModel model) 
    { 
     ... 
    } 
} 

其中FilterViewModel

public class FilterViewModel 
{ 
    public string Attributes { get; set; } 
    public string PriceRange { get; set; } 
} 

,如果你想你的FilterViewModel看起來像這樣:

public class FilterViewModel 
{ 
    public string[] Attributes { get; set; } 
    public decimal? StartPrice { get; set; } 
    public decimal? EndPrice { get; set; } 
} 

你可以寫一個客戶這個視圖模型的tom model binder會解析各種路由令牌。

如果您需要示例,請給我打電話。


UPDATE:

如這裏請求是可能被用於路由的值解析到相應的視圖模型屬性的示例模型粘合劑:

public class FilterViewModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var model = new FilterViewModel(); 
     var attributes = bindingContext.ValueProvider.GetValue("attributes"); 
     var priceRange = bindingContext.ValueProvider.GetValue("pricerange"); 

     if (attributes != null && !string.IsNullOrEmpty(attributes.AttemptedValue)) 
     { 
      model.Attributes = (attributes.AttemptedValue).Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
     } 

     if (priceRange != null && !string.IsNullOrEmpty(priceRange.AttemptedValue)) 
     { 
      var tokens = priceRange.AttemptedValue.Split('-'); 
      if (tokens.Length > 0) 
      { 
       model.StartPrice = GetPrice(tokens[0], bindingContext); 
      } 
      if (tokens.Length > 1) 
      { 
       model.EndPrice = GetPrice(tokens[1], bindingContext); 
      } 
     } 

     return model; 
    } 

    private decimal? GetPrice(string value, ModelBindingContext bindingContext) 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      return null; 
     } 

     decimal price; 
     if (decimal.TryParse(value, out price)) 
     { 
      return price; 
     } 

     bindingContext.ModelState.AddModelError("pricerange", string.Format("{0} is an invalid price", value)); 
     return null; 
    } 
} 

這將在Application_Start中被註冊Global.asax

ModelBinders.Binders.Add(typeof(FilterViewModel), new FilterViewModelBinder()); 
+0

我從來沒有使用過自定義ModelBind呃,你可以發佈一個例子或者一個解釋如何使用的鏈接,它會非常有用! :) – Zingui 2012-02-14 11:36:46

+2

@RenanVieira,我用一個例子更新了我的帖子。 – 2012-02-14 13:05:33

+0

哇...非常詳細!謝謝! – Zingui 2012-02-14 16:35:19