Маршрут NancyFX Catch All
-
12-12-2019 - |
Вопрос
Поддерживает ли NancyFX ASP.NET MVC, например маршрут «Catch All»?Мне нужен тот, который в основном соответствует каждому URL-адресу.Это очень удобно для создания одностраничных приложений.
Это возможно?
Решение
Да, используя Regex
Get[@"/(.*)"] = parameters => {
return View["viewname", parameters];
};
.
Но вам это не нужно для создания приложения одной страницы с NANCYFX - вы можете просто использовать Get и Post со всей логикой маршрутизации, и все еще есть приложение для одной страницы.
Другие советы
Tested in Nancy version 0.23.2
Get[@"/(.*)"]
для меня не работал как универсальный маршрут.Маршруты "/", "/фу/бар", а более длинные маршруты не поймали бы.Кажется, что не обойтись без определения Get["/"]
маршрут для корневого URL-адреса.Кажется, больше ничего не ловит (пробовал Get["{uri*}"]
).Вот как я определил свои маршруты (имейте в виду, что я делаю это для приложения Angular):
Get["/views/{uri*}"] = _ => { return "A partial view..."; };
Get["/"] =
Get["/{uri*}"] = _ =>
{
var uri = (string)_.uri;// The captured route
// If you're using OWIN, you can also get a reference to the captured route with:
var environment = this.Context.GetOwinEnvironment();// GetOwinEnvironment is in the 'Nancy.Owin' namespace
var requestPath = (string)environment["owin.RequestPath"];
return View["views/defaultLayout.html"];
};
Важно понять Оценка шаблонов.Шаблоны маршрутов взвешиваются: если два маршрута соответствуют одному и тому же сегменту URL-адреса, выигрывает более высокий балл.Всеобъемлющий шаблон взвешен 0
и хотя /views/{uri*}
Шаблон маршрута также является универсальным, он начинается с литерала, который имеет взвешенный вес. 10000
, поэтому он выиграет на всех маршрутах, начинающихся с /Просмотры.
Вот дополнительная информация о Доступ к переменным среды Owin.Обратите внимание, что захваченный uri
переменная и requestPath
будет немного отличаться.А requestPath
начнется с /
где как uri
переменная не будет.Кроме того, если совпадающий шаблон маршрута Get["/"]
, uri
будет null
и requestPath
будет "/"
.
А Взгляды маршрут вернет частичный HTML-файл на основе URL-адреса, а все остальные маршруты вернут страницу макета по умолчанию, которая будет загружать SPA.
Обновленный ответ, на который решение @synhershko не работает.Попробуйте:
Get[@"^(.*)$"] = parameters => {
return "hi";
};
.
Это будет захватывать все пути, кроме страницы индекса.Я не уверен, что будет работать в контексте угловой, но это сработало для меня при попытке взломать простой сервер с одним обработчиком.
Ответ, предоставленный @synhershko не работает для меня.Он не обрабатывает / пользователи / 2 или любой другой маршрут, содержащий больше серите.
ниже код работает на моей машине;):
public class IndexModule : NancyModule
{
dynamic IndexPage() { return View["Index"]; }
public IndexModule()
{
Get["/"] = _ => { return IndexPage(); };
Get["/(.*)"] = _ => { return IndexPage(); };
Get["/(.*)/(.*)"] = _ => { return IndexPage(); };
Get["/(.*)/(.*)/(.*)"] = _ => { return IndexPage(); };
}
}
.
Мое решение не идеально, потому что он не совпадает все .Я повторил столько "/(.*), как в моем длинном угловом пути.