Лучший способ взглянуть на ASP.NET MVC с QueryStrings - это воспринимать их как значения, о которых маршрут не знает. Как вы узнали, QueryString не является частью RouteData, поэтому вы должны хранить то, что вы передаете, в виде строки запроса отдельно от значений маршрута.
Способ обойти их - создать значения по умолчанию самостоятельно в действии, если значения, переданные из QueryString, равны нулю.
В вашем примере маршрут знает о x, поэтому ваш URL должен действительно выглядеть так:
/Test/Foo or /Test/Foo/5
и маршрут должен выглядеть так:
routes.MapRoute("test", "Test/Foo/{x}", new {controller = "Test", action = "Foo", x = 1});
Чтобы получить поведение, которое вы искали.
Если вы хотите передать значение QueryString, скажем, как номер страницы, вы должны сделать это:
/Test/Foo/5?page=1
И ваше действие должно измениться следующим образом:
public ActionResult Foo(int x, int? page)
{
Trace.WriteLine(x);
Trace.WriteLine(page.HasValue ? page.Value : 1);
return new EmptyResult();
}
Сейчас тест:
Url: /Test/Foo Trace: 1 1 Url: /Test/Foo/5 Trace: 5 1 Url: /Test/Foo/5?page=2 Trace: 5 2 Url: /Test/Foo?page=2 Trace: 1 2
Надеюсь, что это помогает прояснить некоторые вещи.
Liquibase имеет атрибут failOnError, который можно установить в значение false в наборах изменений, которые включают вызов, который может завершиться ошибкой.
<changeSet failOnError="false">
<createSequence sequenceName="new_sequence"/>
</changeSet>
Это позволяет вам просто создать пользователя, создать последовательность, удалить пользователя и удалить набор изменений последовательности, и если оператор выдает ошибку, потому что эти пользователи / последовательности существуют / не существуют, они все равно будут помечены как запущенные, а обновление будет продолжаться.
Обратной стороной этого подхода является то, что он также помечает их как запущенные и продолжает работу, если они ошибаются по какой-либо другой причине (неправильные разрешения, сбой соединения, недопустимый SQL и т. д.). Более точный подход - использовать предварительные условия , например:
<changeSet>
<preconditions onFail="MARK_RAN"><not><sequenceExists/></not></preconditions>
<createSequence name="new_sequence"/>
</changeSet>
В настоящее время предварительного условия userExists нет, но вы можете создать собственные предварительные условия или вернуться к предварительному условию. См. http://www.liquibase.org/documentation/preconditions.
Напишите функцию do_ddl, подобную этой и перехватить все исключения, которые вы хотите перехватить:
DECLARE
allready_null EXCEPTION;
PRAGMA EXCEPTION_INIT(allready_null, -1451);
BEGIN
execute immediate 'ALTER TABLE TAB MODIFY(COL NULL)';
EXCEPTION
WHEN allready_null THEN
null; -- handle the error
END;
/
Я бы просто использовал анонимный блок PL / SQL.
begin
for x in (select sequence_name
from user_sequences
where sequence_name in ('SEQ1','SEQ2' ... 'SEQn'))
loop
execute immediate 'drop sequence '||x.sequence_name;
end loop;
end;
/