Websharper, сайтлеты и формы

Я пытался создать форму с помощью Websharper для сбора пользовательского ввода. На данный момент я определил три действия для своего сайта:

type MyAction =
    | [<CompiledName "">] Index
    | [<Method "POST">] GetUser of username : string
    | Stats of username: string

Используя Sitelet.Infer, мне удалось реализовать базовый пользовательский интерфейс, но я понятия не имею, как обращаться к содержимому моего поля ввода (usernameInput):

Sitelet.Infer <| function
    | Index ->
        Content.PageContent <| fun ctx ->
            let usernameInput= Input [Text ""]
            { Page.Default with
                Title = Some "Welcome!"
                Body = 
                    [ 
                        Div [
                            Form
                                [
                                    usernameInput-< [Name "username" ]
                                    Input [Value "Request"] -< [Type "submit" ]

                                ] -< [ Attr.Action (ctx.Link (* GetUser usernameInput.Content *) ); Method "POST" ]
                        ]
                    ]
            }
    | GetUser username ->
        Content.Redirect <| Stats username
    | Stats username ->
        Content.PageContent <| fun ctx ->
            { Page.Default with
                Body = [Text ("Stats for " + username)] }

Я заметил, что usernameInput не имеет поля типа «Значение» или около того, и я думаю, что либо ему нужно приведение, либо я делаю что-то не так.

Я бы предпочел не использовать JavaScript в своем коде (можно ли вообще смешивать элементы Html.Server и Html.Client в Sitelet?).


person Alojzy Leszcz    schedule 07.04.2015    source источник


Ответы (1)


Данные формы POST не передаются через URL-адрес, поэтому вы не можете передать их с помощью ctx.Link. Он автоматически передается через тело запроса в формате, аналогичном аргументам запроса GET (например, в вашем случае username=myusername). В настоящее время это не анализируется Sitelet.Infer, хотя мы, вероятно, добавим его в будущем. На данный момент вы можете использовать действие без аргументов, а затем извлечь данные из запроса:

type MyAction =
    | [<Method "POST">] GetUser
    | // ...

Sitelet.Infer <| function
    | GetUser ->
        Content.CustomContentAsync <| fun ctx ->
            match ctx.Request.Post.["username"] with
            | None -> Content.NotFound
            | Some username -> Content.Redirect <| Stats username
            |> Content.ToResponseAsync ctx
    | // ...
person Tarmil    schedule 08.04.2015
comment
Я реализовал это, но словарь ctx.Request.Post.[] не содержит значений (т.е. каждый раз, когда он попадает в случай None при сопоставлении с образцом выше; я отладил его и заметил, что в ctx.Request.Post нет значений ). Есть ли что-нибудь еще, что мне нужно сделать, чтобы заставить его работать? - person Alojzy Leszcz; 08.04.2015
comment
Что добавить: мой браузер показывает, что сгенерированный запрос POST содержит значение имени пользователя, но каким-то образом ctx (на стороне F #) этого не делает. - person Alojzy Leszcz; 08.04.2015
comment
ОК - у меня есть ответ здесь: websharper.com/question/ 79205/ - person Alojzy Leszcz; 17.04.2015