В OpenRasta возможно ли Pattern сопоставить несколько пар ключ / значение? - PullRequest
2 голосов
/ 20 мая 2010

Возможно ли в OpenRasta иметь шаблон Uri, который позволяет отправлять массив значений одного и того же ключа и сопоставлять его с методом-обработчиком, принимающим массив параметров запроса.

Пример: вернуть все контакты с именем Дейв Смит из коллекции.

HTTP GET / contacts? FilterBy = first & filterValue = Dave & filterBy = last & filterValue = Smith

С конфигурацией:

Какой синтаксис будет наилучшим для сопоставления с образцом строки Uri? (Предложения приветствуются)

ResourceSpace.Has.ResourcesOfType<List<ContactResource>>()
    .AtUri("/contacts")
    .And.AtUri("/contacts?filterBy[]={filterBy}[]&filterValue[]={fv}[]") // Option 1
    .And.AtUri("/contacts?filterBy={filterBy}[]&fv={fv}[]") // Option 2

будет соответствовать методу обработчика:

public object Get(params Filter[] filters)
{
    /*
    create a Linq Expression based on the filters using dynamic linq
    query the repository using the Linq
    */

    return Query.All<Contact>().Where(c => c.First == "Dave" && c.Last == "Smith").ToResource()
}

, где Фильтр определяется как

public class Filter
{
    public string FilterBy { get; set; }
    public string FilterValue { get; set; }
}

1 Ответ

4 голосов
/ 21 мая 2010

.AtUri("/contacts?filterBy={filterby}&filterValue={filterValue}") должен счастливо отобразиться на

Post(string[] filterby, string[] filterValues)

Это должно быть обработано правильно, если нет, то это ошибка.

Вы также можете использовать синтаксис объекта, если хотите что-то более приятное:

<input name="Filter:0.FilterBy" />
<input name="Filter:1.FilterBy" />

и имеют

Post(IEnuemrable<Filter> filter)

Но вам, вероятно, понадобится использовать для этого сообщение, а не получить. Обычный способ решить эту проблему - выполнить Post-Redirect-Get для полностью встроенного URI, что также лучше для кэширования

...