Html Websharper、Sitelet和表单

Html Websharper、Sitelet和表单,html,forms,f#,websharper,Html,Forms,F#,Websharper,我一直在尝试使用Websharper创建一个表单来收集用户输入。到目前为止,我已经为我的网站确定了三项行动: type MyAction = | [<CompiledName "">] Index | [<Method "POST">] GetUser of username : string | Stats of username: string 键入MyAction= |[]索引 |[]获取用户名的用户:字符串 |用户名的统计信息:strin

我一直在尝试使用Websharper创建一个表单来收集用户输入。到目前为止,我已经为我的网站确定了三项行动:

type MyAction =
    | [<CompiledName "">] Index
    | [<Method "POST">] GetUser of username : string
    | Stats of username: string
键入MyAction=
|[]索引
|[]获取用户名的用户:字符串
|用户名的统计信息:string
使用Sitelet.Infert我已经实现了基本的UI,但我不知道如何引用输入框(usernameInput)的内容:

Sitelet.infere
Content.PageContent
让usernameInput=Input[Text”“]
{Page.默认为
Title=一些“欢迎!”
正文=
[ 
Div[
形式
[
用户名输入-<[Name“username”]
输入[值“请求”]-<[输入“提交”]
]-<[Attr.Action(ctx.Link(*GetUser usernameInput.Content*);方法“POST”]
]
]
}
|GetUser用户名->
内容重定向
Content.PageContent
{Page.默认为
Body=[文本(“+username]”的统计信息]
我注意到usernameInput没有任何像“Value”这样的字段,我想要么它需要强制转换,要么我做错了什么


我不希望在我的代码中使用JavaScript(是否可以在Sitelet中混合使用Html.Server和Html.Client元素?)

表单POST数据不是通过URL传递的,因此不能通过
ctx.Link
传递。它通过请求体自动传递,格式类似于GET查询参数(例如,在您的示例中,
username=myusername
)。目前,
Sitelet.infere
尚未解析此内容,尽管我们可能会在将来添加它。目前,您可以使用不带参数的操作,然后从请求中提取数据:

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
    | // ...
键入MyAction=
|[]获取用户
| // ...
Sitelet.推断
Content.CustomContentAsync
将ctx.Request.Post。[“用户名”]与匹配
|无->内容未找到
|某些用户名->内容.重定向内容.ToResponseAsync ctx
| // ...

我实现了这一点,但字典ctx.Request.Post.[]不包含任何值(即,每当它在上面的模式匹配中遇到“None”时;我已经调试过它,并注意到ctx.Request.Post中没有任何值)。我还需要做些什么才能使其正常工作?需要补充的是:我的浏览器显示生成的POST请求包含“username”值,但不知何故ctx(在F#端)没有。好的-我在这里得到了答案:
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
    | // ...