Каков наилучший способ привязать информацию фильтра ExtJs 4 Grid к параметрам действия asp.net mvc? - PullRequest
5 голосов
/ 31 мая 2011

Как лучше всего связать информацию фильтра ExtJs 4 Grid с параметрами действия asp.net mvc?

Я написал эти вспомогательные классы:

public class ExtFilterInfo
{
    public string Field { get; set; }
    public ExtFilterData Data { get; set; }
}

public class ExtFilterData
{
    public string Type { get; set; }
    public string Value { get; set; }
}

Вот действие:

public ActionResult Grid(int start, int limit, string sort, ExtFilterInfo[] filter)

QueryString выглядит примерно так:

_dc:1306799668564
filter%5B0%5D%5Bfield%5D:Nome
filter%5B0%5D%5Bdata%5D%5Btype%5D:string
filter%5B0%5D%5Bdata%5D%5Bvalue%5D:nu
page:1
start:0
limit:20

1 Ответ

4 голосов
/ 31 мая 2011

Папка для пользовательских моделей выглядит так, как будто она может соответствовать всем требованиям:

public class ExtFilterInfoModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var filter = (ExtFilterInfo)base.BindModel(controllerContext, bindingContext);

        var field = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[field]");
        if (field != null)
        {
            filter.Field = field.AttemptedValue;
        }

        var type = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[data][type]");
        if (type != null)
        {
            if (filter.Data == null)
            {
                filter.Data = new ExtFilterData();
            }
            filter.Data.Type = type.AttemptedValue;
        }

        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[data][value]");
        if (value != null)
        {
            if (filter.Data == null)
            {
                filter.Data = new ExtFilterData();
            }
            filter.Data.Value = value.AttemptedValue;
        }

        return filter;
    }
}

который может быть зарегистрирован в Application_Start:

ModelBinders.Binders.Add(typeof(ExtFilterInfo), new ExtFilterInfoModelBinder());

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

...