WebSharper - Есть ли простой способ отловить "не найденные" маршруты?
Есть ли простой способ использования Sitelets
а также Application.MultiPage
создать своего рода маршрут по умолчанию (например, чтобы поймать "не найденные" маршруты)?
пример
type EndPoint =
| [<EndPoint "/">] Home
| [<EndPoint "/about">] About
[<Website>]
let Main =
Application.MultiPage (fun ctx endpoint ->
match endpoint with
| EndPoint.Home -> HomePage ctx
| EndPoint.About -> AboutPage ctx
Я хотел бы определить EndPoint
это может обрабатывать запросы на что угодно, но "/home"
а также "/about"
,
1 ответ
Я только что опубликовал исправление ошибки (WebSharper 3.6.18), которое позволяет вам использовать Wildcard
атрибут для этого:
type EndPoint =
| [<EndPoint "/">] Home
| [<EndPoint "/about">] About
| [<EndPoint "/"; Wildcard>] AnythingElse of string
[<Website>]
let Main =
Application.MultiPage (fun ctx endpoint ->
match endpoint with
| EndPoint.Home -> HomePage ctx
| EndPoint.About -> AboutPage ctx
| EndPoint.AnythingElse path -> Content.NotFound // or anything you want
)
Обратите внимание, что это будет перехватывать все, даже URL-адреса файлов, например, если у вас есть содержимое на стороне клиента, тогда URL-адреса /Scripts/WebSharper/*.js
больше не будет работать Если вы хотите сделать это, вам нужно перейти на пользовательский маршрутизатор:
type EndPoint =
| [<EndPoint "/">] Home
| [<EndPoint "/about">] About
| AnythingElse of string
let Main =
Application.MultiPage (fun ctx endpoint ->
match endpoint with
| EndPoint.Home -> HomePage ctx
| EndPoint.About -> AboutPage ctx
| EndPoint.AnythingElse path -> Content.NotFound // or anything you want
)
[<Website>]
let MainWithFallback =
{ Main with
Router = Router.New
(fun req ->
match Main.Router.Route req with
| Some ep -> Some ep
| None ->
let path = req.Uri.AbsolutePath
if path.StartsWith "/Scripts/" || path.StartsWith "/Content/" then
None
else
Some (EndPoint.AnythingElse path))
(function
| EndPoint.AnythingElse path -> Some (System.Uri(path))
| a -> Main.Router.Link a)
}
(скопировано из моего ответа на форумах WebSharper)