Websharper F # endpoints - поймать весь обработчик страницы и перенаправление страницы - PullRequest
0 голосов
/ 11 мая 2018

извините, это такой длинный пост

Я использую F # и WebSharper (я новичок в обеих технологиях)

У меня определены некоторые конечные точки (у меня есть рабочий код, пока я не добавлюКонечная точка NotFound)

type EndPoint =
    | [<EndPoint "/">] Home
    | [<EndPoint "/login">] Login
    | [<EndPoint "/about">] About
    | [<EndPoint "/logout">] Logout

    // trying to make a catch-all page handler
    | [<EndPoint "/"; Wildcard>] NotFound of string 
...
let HomePage ctx =
    Templating.Main ctx EndPoint.Home "Home" [
        // page stuff
    ]

let LoginPage ctx =
    Templating.Main ctx EndPoint.Login "Login" [
        h1 [] [text "Login Here"]
        div [] [client <@ Client.LoginWidget() @>]
    ]

// other page constructs
let MissingPage ctx path =
    Templating.Main ctx EndPoint.About "Page Not Found" [
        h1 [] [text "404"]
        p [] [text "The requested page could not be found"]
        p [] [text path]
    ]
...
[<Website>]
let Main =
    Application.MultiPage (fun ctx endpoint ->
        match endpoint with
        | EndPoint.Home -> HomePage ctx
        | EndPoint.About -> AboutPage ctx
        | EndPoint.Login -> LoginPage ctx
        | EndPoint.Logout -> 
            async {
                // call server-side code to log the user out
                // what would i do here to redirect the user to the /login 
                // page
            }
        | EndPoint.NotFound path -> MissingPage ctx path
    )

Добавление конечной точки NotFound портит другие мои страницы, например, моя домашняя страница начинает обрабатываться обработчиком MissingPage.что я могу понять, так как домашняя страница настроена на совпадение с "/", а шаблон не соответствует "/", хотя я ожидал, что сингл / будет соответствовать конечной точке Home и чему-либо еще, кроме / Login / About и/ Выход для соответствия ветке NotFound.Но ясно, что я что-то не правильно понимаю.

Итак, как я могу получить конечную точку типа «универсальный», чтобы я мог правильно обрабатывать любой путь, который явно не обслуживается для

Другая вещь, которая мешает, когда у меня был код обработки NotFound, это то, что обработчик входа больше не обрабатывает

div [] [client <@ Client.LoginWidget() @>]

И, наконец, в обработчике выхода из системы я хочу вызвать некоторый код на стороне сервера (без проблем)но что я должен сделать, чтобы затем перенаправить на новую веб-страницу, например, чтобы отправить пользователя обратно на страницу / login?

Еще раз извините за такой длинный пост Дерек

1 Ответ

0 голосов
/ 14 мая 2018

Ниже основывается на том, что Лоик на websharper.com передал мне, добавив здесь, если это будет полезно для кого-то еще.

Требуется первый Web.config

<httpErrors errorMode="Custom">
  <remove statusCode="404"/>
  <error statusCode="404" responseMode="ExecuteURL" path="/notfound"/>
</httpErrors>

type EndPoint = 
... other end points
| [<EndPoint "/notfound"; Wildcard>] NotFound of string


[<Website>]
let Main =
    Application.MultiPage (fun ctx endpoint ->
        match endpoint with
        // handle other endpoints
        // Handle none existant paths
        | EndPoint.NotFound _ ->
            // Parse the original URI from ASP.NET's rewrite, in case you need it
            let requestedUri =
                let q = ctx.RequestUri.Query
                let q = q.[q.IndexOf(';') + 1 ..]
                match System.Uri.TryCreate(q, System.UriKind.Absolute) with
                // The request was to /notfound/... directly
                | false, _ -> ctx.RequestUri
                // The request was to a non-existent path, and rewritten by ASP.NET
                | true, uri -> uri

          Content.Text (sprintf "Unknown URI: %A" requestedUri)
          |> Content.SetStatus Http.Status.NotFound

...
...