保护多个参数化页面

时间:2012-02-24 04:49:52

标签: f# websharper

示例sitelet项目模板显示了如何保护单个非参数化页面。我已经google了一下,仔细阅读了WebSharper的网站等,并且无法弄清楚如何保护多个参数化页面。有人可以告诉我,或指出我,如何做到这一点的一个例子?

1 个答案:

答案 0 :(得分:2)

此问题最近又出现在FPish上。似乎有一个简单的解决方案,不需要大量的重构。它需要一个辅助功能:

module Sitelet =

  let Filter (ok: 'T -> bool) (sitelet: Sitelet<'T>) =
    let route req =
        match sitelet.Router.Route(req) with
        | Some x when ok x -> Some x
        | _ -> None
    let link action =
        if ok action then
            sitelet.Router.Link(action)
        else None
    { sitelet with Router = Router.New route link }

假设你有一个包含几种情况的Action类型,其中一些你想要受保护,一些是公开的:

type Action =
    | Pub ..
    | Priv ..

过滤允许您在完整类型上使用方便的Infer组合器,然后安全地对受保护和公共部分求和。由于求和的sitelet是从左到右尝试的,因此保护仅适用于需要的地方:

let s1 =
    Sitelet.Infer ..
    |> Sitelet.Protect
    |> Sitelet.Filter (function Priv _ -> true | _ -> false)
let s2 = Sitelet.Infer ..
Sitelet.Sum [s1; s2]

如果不进行过滤,受保护的sitelet将捕获所有请求。可能还有其他解决方案,包括重构和将Action类型拆分为多个子类型,或者手动编写sitelet而不使用Infer