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)

Другие вопросы по тегам