Метод действия MVC и канал в параметре строки запроса

У меня есть вызов метода действия get со списком параметров строки запроса, передаваемых этому методу. У некоторых из этих параметров есть вертикальная черта '|' в них. Проблема в том, что у меня не может быть параметров метода действия с символами вертикальной черты. Как сопоставить передаваемый параметр строки запроса с непередаваемым параметром C#? Или есть еще какие-то хитрости, о которых я не знаю?


person Sachin Kainth    schedule 18.09.2012    source источник


Ответы (1)


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

/foo/bar?foos=foo1|foo2|foo3&bar=baz

и вы хотите связать этот запрос со следующим действием:

public ActionResult SomeAction(string[] foos, string bar)
{
    ...
}

Все, что вам нужно сделать, это написать собственный модуль связывания модели:

public class PipeSeparatedValuesModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (values == null)
        {
            return Enumerable.Empty<string>();
        }

        return values.AttemptedValue.Split('|');
    }
}

а потом:

public ActionResult SomeAction(
    [ModelBinder(typeof(PipeSeparatedValuesModelBinder))] string[] foos, 
    string bar
)
{
    ...
}
person Darin Dimitrov    schedule 18.09.2012