MVC 3 маршрут для поиска - PullRequest
       19

MVC 3 маршрут для поиска

3 голосов
/ 14 февраля 2012

Я разрабатываю поиск с динамическим количеством флажков и диапазоном цен.Мне нужен маршрут, который отображает что-то вроде этого:

/ Фильтр / Атрибуты / Атрибут1, Атрибут2, Атрибут3 / Цена / 1000-2000

Это хороший способсделай это?Как я могу сделать этот маршрут?

1 Ответ

4 голосов
/ 14 февраля 2012
routes.MapRoute(
    "FilterRoute",
    "filter/attributes/{attributes}/price/{pricerange}",
    new { controller = "Filter", action = "Index" }
);

и в вашем действии 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; }
}

вы можете написать пользовательское связующее для этой модели представления, которое будет анализировать различные маркеры маршрута.

Пин мне, если тебе нужен пример.


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());
...