4

現在、F#で独自の基本的なビューエンジンを実装しようとしています。基本的に、私はVirtualPathProviderViewEngineから継承しています。

これを行うには、2つのビューの場所を設定して、エンジンがビューを探す場所を認識できるようにする必要があります。私のF#タイプでは、上記から継承し、2つのビューの場所を以下のように設定しようとしています...

type FSharpViewEngine() =
inherit VirtualPathProviderViewEngine()

let viewLocations = [| "~/Views/{1}/{0}.fshtml"; "~/Views/Shared/{0}.fshtml" |]

member this.ViewLocationFormats = viewLocations
member this.PartialViewLocationFormats = viewLocations

上記のコードは、VirtualPathProviderViewEngineに必要なオーバーライドを省略しています。プロジェクトを実行すると、次のようなエラーメッセージが表示されます

プロパティ'ViewLocationFormats'をnullまたは空にすることはできません。

私が想定しているのは、上記の2つの基本メンバーを正しく設定していないことを意味します。私は上記を間違って割り当てているだけですか、それとも私が何か間違ったことをしているのではないかと思いますか?

追加情報として、起動時にGlobal.fs(global.asax)にViewEngineを追加しました...

ViewEngines.Engines.Add(new FSharpViewEngine())
4

1 に答える 1

7

基本クラスのプロパティを設定するだけの場合は、memberまたはは必要ありませんがoverride、代わりに<-コンストラクターで代入演算子を使用する必要があります。エンジンを実装するには、エンジンが定義する2つの抽象メソッドをオーバーライドする必要があるため、次のようなものが必要になります。

type FSharpViewEngine() =
    inherit VirtualPathProviderViewEngine() 

    let viewLocations = [| "~/Views/{1}/{0}.fshtml"; "~/Views/Shared/{0}.fshtml" |]
    do base.ViewLocationFormats <- viewLocations
       base.PartialViewLocationFormats <- viewLocations

    override x.CreatePartialView(ctx, path) = failwith "TODO!"
    override x.CreateView(ctx, viewPath, masterPath) = failwith "TODO!"
于 2012-11-06T12:37:47.837 に答える