Разработка проектов Django с помощью Мерзавца

Я не могу воспроизвести вашу проблему. У меня есть этот код внутри контроллера MVC, который является точно таким же кодом для генерации URL, который показан в вопросе:

public IActionResult Test()
{
    int number = 4;
    string callbackUrl = Url.Page(
        "/Test/Name",
        pageHandler: null,
        values: new { number },
        protocol: Request.Scheme);

    return Json(new
    {
        callbackUrl
    });
}

Кроме того, у меня есть страница Razor в /Pages/Test/Name.cshtml со следующим Содержание:

@page "{number}"
Hello @RouteData.Values["number"]!

Обратите внимание на спецификацию параметра маршрута number, который соответствует параметру маршрута, указанному в вызове Url.Page внутри контроллера.

Если я запускаю это приложение и открываю http://localhost:5000/Home/Test, то я получаю следующий ответ, который именно то, что я ожидаю получить:

{"callbackUrl":"http://localhost:5000/Test/Name/4"}

Если вы видите null вместо этого, шансы в том, что значение маршрута number не соответствует параметру на вашей странице Razor. В этом случае при маршрутизации не найдена подходящая страница Razor.

Если у вас есть непараметризованная страница Razor (т. Е. Просто @page без аргумента), ответ от действия MVC должен быть следующим, где значение маршрута предоставляется в качестве аргумента запроса:

{"callbackUrl":"http://localhost:5000/Test/Name?number=4"}

Вместо UrlHelper, который зависит от значений окружения и, как таковой, лучше всего используется в действиях контроллера или представлениях Razor, вы также можете использовать новый LinkGenerator . LinkGenerator обычно дает вам тот же опыт, что и UrlHelper, но не требует настройки окружения, поэтому его можно использовать одинаково, независимо от того, где вы на самом деле находитесь.

8
задан Rob Golding 17 May 2009 в 23:01
поделиться

3 ответа

При отправке в удаленный репозиторий наилучшие результаты достигаются, когда удаленный репозиторий является «пустым» репозиторием без рабочего каталога. Похоже, у вас есть рабочий каталог в удаленном репозитории, который не будет обновляться Git при выполнении push.

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

Для развертывания я бы рекомендовал продвинуть свою работу в центральное «голое» хранилище, а затем наличие процесса, при котором сервер развертывания извлекает последний код из центрального репозитория в свой рабочий каталог.

12
ответ дан 5 December 2019 в 11:26
поделиться

Была та же проблема, также работала с django.

Согласитесь на локальное тестирование перед развертыванием, как уже упоминалось.

Затем вы можете отправить локальную версию в новую ветку на сервер. Затем вы выполняете слияние с этой веткой и мастером. После этого вы увидите обновленные файлы.

Если вы случайно нажали на главную ветку, вы можете выполнить git reset --hard. Однако все изменения, не внесенные в текущую рабочую ветку, будут потеряны. Так что берегите себя.

0
ответ дан 5 December 2019 в 11:26
поделиться

При отправке в (общий) репозиторий git рабочие файлы этого репозитория не обновляются. В основном потому, что рабочие файлы могут быть грязными, и в этом случае вам придется объединить --- и для этого вам нужен полный доступ к оболочке, что может быть не так в общем случае.

Если вы хотите иметь самый последний «мастер» общего репо где-то извлечен, вы можете организовать это, написав хук после обновления. Я приведу пример одного из них, который я использую, чтобы проверить подкаталог «ui» и сделать его доступным для Apache.

Однако я скажу, что я думаю, что ваш процесс можно улучшить. Разработчикам обычно нужны персональные серверы, на которых они могут протестировать, прежде чем переходить к общей точке: в противном случае это общее репо будет ужасно ненадежным. Рассматривать, если я нажимаю на него изменение, а оно не работает, это мое изменение, которое нарушило его, или побочный эффект чьего-то другого?

Хорошо, я использую это как ловушку после обновления:

#!/bin/sh
# Should be run from a Git repository, with a set of refs to update from on the command line.
# This is the post-update hook convention.

info() {
    echo "post-update: $@"
}

die() {
    echo "post-update: $@" >&2
    exit 1
}

output_dir=..
for refname in "$@"; do
    case $refname in
        refs/heads/master)
            new_tree_id=$(git rev-parse $refname:ui)
            new_dir="$output_dir/tree-$new_tree_id"
            if [ ! -d "$new_dir" ]; then
                info "Checking out UI"
                mkdir "$new_dir"
                git archive --format=tar $new_tree_id | ( cd $new_dir && tar xf - )
            fi
            prev_link_target=$(readlink $output_dir/current)
            if [ -n "$prev_link_target" -a "$prev_link_target" = "tree-$new_tree_id" ]; then
                info "UI unchanged"
            else
                rm -f $output_dir/current
                ln -snf "tree-$new_tree_id" "$output_dir/current"
                info "UI updated"
                title=$(git show --quiet --pretty="format:%s" "$refname" | \
                    sed -e 's/[^A-Za-z][^A-Za-z]*/_/g')
                date=$(git show --quiet --pretty="format:%ci" "$refname" | \
                    sed -e 's/\([0-9]*\)-\([0-9]*\)-\([0-9]*\) \([0-9]*\):\([0-9]*\):\([0-9]*\) +0000/\1\2\3T\4\5\6Z/')
                ln -s "tree-$new_tree_id" "$output_dir/${date}__${title}"
            fi
            ;;
    esac
done

Как упоминалось , это просто проверяет подкаталог "ui". Это бит ": ui", устанавливающий new_tree_id. Просто возьмите ": ui" (или измените его на "^ {tree}"), чтобы проверить все.

Оформление заказов осуществляется в каталоге, содержащем репозиторий git, управляемый output_dir. Ожидается, что сценарий будет выполняться внутри репозитория git (который, в свою очередь, должен быть пустым): это не очень чисто.

Отчеты помещаются в каталоги "tree-XXXX", а "текущая" символическая ссылка указывает к самому последнему. Это делает переход с одного на другой атомарным, хотя вряд ли это займет так много времени, чтобы иметь значение. Это также означает возврат к повторному использованию старых файлов. И это также означает, что он занимает место на диске, когда вы продолжаете продвигать исправления ...

3
ответ дан 5 December 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: