Контейнеры Python содержат ссылки на другие объекты. См. Этот пример:
>>> a = []
>>> b = [a]
>>> b
[[]]
>>> a.append(1)
>>> b
[[1]]
В этом b
есть список, содержащий один элемент, который является ссылкой на список a
. Список a
изменен.
Умножение списка на целое эквивалентно добавлению списка к себе несколько раз (см. операции общей последовательности ). Итак, продолжаем с примера:
>>> c = b + b
>>> c
[[1], [1]]
>>>
>>> a[0] = 2
>>> c
[[2], [2]]
Мы видим, что список c
теперь содержит две ссылки на список a
, который эквивалентен c = b * 2
.
Python FAQ также содержит объяснение этого поведения: Как создать многомерный список?
Насколько я знаю, вы не можете передать сложный объект напрямую, но вы можете избежать необходимости сами строить строку запроса, передав RouteValueDictionary
:
@Html.ActionLink("Edit", "Edit", new RouteValueDictionary {
{"SearchSortPageParams.SortOrder", evm.SearchSortPageParams.SortOrder },
{ /* etc... */ }
})
. Это должно генерировать строка запроса по мере необходимости.
Единственной альтернативой было бы использование отражения для итерации по свойствам модели и генерации этого словаря таким образом, но это, на мой взгляд, было бы чрезмерно спроектировано.
Конечно, я бы вообще предложил в этой ситуации, что у вас просто есть ваш метод действий, который принимает отдельные параметры:
public ActionResult Search(string searchString, SortOrder sortOrder, ...)
Я обычно считаю это более подходящим способом передать параметры GET методу (конечно, это может стать громоздким, если у вас много параметров). Затем вы можете просто сделать следующее, что намного более аккуратно:
@Html.ActionLink("Edit", "Edit",
new { sortOrder = evm.SearchSortPageParams.SortOrder, ... })