Я не могу воспроизвести вашу проблему. У меня есть этот код внутри контроллера 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, но не требует настройки окружения, поэтому его можно использовать одинаково, независимо от того, где вы на самом деле находитесь.
При отправке в удаленный репозиторий наилучшие результаты достигаются, когда удаленный репозиторий является «пустым» репозиторием без рабочего каталога. Похоже, у вас есть рабочий каталог в удаленном репозитории, который не будет обновляться Git при выполнении push.
В вашей ситуации я бы порекомендовал разработчикам иметь свою собственную тестовую среду, которую они могут протестировать локально, прежде чем иметь протолкнуть свой код куда-нибудь еще. Наличие одного центрального места, где каждый должен продвигать свою работу, прежде чем они смогут даже попытаться , это приведет к большим страданиям и страданиям.
Для развертывания я бы рекомендовал продвинуть свою работу в центральное «голое» хранилище, а затем наличие процесса, при котором сервер развертывания извлекает последний код из центрального репозитория в свой рабочий каталог.
Была та же проблема, также работала с django.
Согласитесь на локальное тестирование перед развертыванием, как уже упоминалось.
Затем вы можете отправить локальную версию в новую ветку на сервер. Затем вы выполняете слияние с этой веткой и мастером. После этого вы увидите обновленные файлы.
Если вы случайно нажали на главную ветку, вы можете выполнить git reset --hard. Однако все изменения, не внесенные в текущую рабочую ветку, будут потеряны. Так что берегите себя.
При отправке в (общий) репозиторий 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", а "текущая" символическая ссылка указывает к самому последнему. Это делает переход с одного на другой атомарным, хотя вряд ли это займет так много времени, чтобы иметь значение. Это также означает возврат к повторному использованию старых файлов. И это также означает, что он занимает место на диске, когда вы продолжаете продвигать исправления ...