2

ビューのモデル データを厳密に型指定することについての投稿がたくさんあります。

ビュー自体を強く型付けすることに興味があります。

ビューのモデル タイプが変更された場合、またはビュー自体の名前/場所が変更された場合、View(xyz) を返すコントローラー アクションが実行時にクラッシュする可能性があることが懸念されます。私の意見では、MVC フレームワークの疎結合は、この特定の領域では行き過ぎており、RAD 環境では非生産的になっています。(重大な変更の通知がすぐに届かない)

.cshtml ファイルが見つからないか、マップできないモデル タイプが原因で View() 呼び出しが無効な場合、コンパイル時エラーをトリガーする方法はありますか?

4

2 に答える 2

5

このディスカッションでは、オブジェクトのアーリー バインディングとレイト バインディング、および各シナリオ固有の利点について説明します。

アーリー バインド オブジェクトはコンパイル時に認識されますが、有限セットでなければなりません。欠落することはできないため、存在しないことに関連する実行時エラーは発生しませんが、セットは有限で不変です。

レイト バインド オブジェクトは、コンパイル時には認識されません。代わりに実行時に認識され、理論的には無限セットになる可能性があります。レイト バインド オブジェクトは通常、非定数 (アプリケーションの実行中に変化するもの) を表します。たとえば、Unity や Ninject などの依存性注入フレームワークは、構成ファイルから遅延バインドして、事実上すべてのオブジェクトを注入できるようにします。Unity または Ninject が挿入されたオブジェクトをコンパイル時に検証する場合、それはそれらのオブジェクトが早期にバインドされたことを意味し、フレームワークは解決される可能性のあるすべての型について知る必要があります...そして、新しい型を導入した場合、あなたは 'それを受け入れるには、フレームワークを再コンパイルする必要があります。

つまり、レイト バインディングは、Microsoft がフレームワークをリリースした時点では不明な MVC ビューなど、未知のものに対応する柔軟性を提供します。

MVC ビューがレイト バインドされる理由は、それらが固定されたセットではないためです。代わりに、それらは実行時に多くのソース (ファイル システムやメモリ オブジェクトなど) からバインドされ、各人の MVC プロジェクトは異なるビューを持ちます。MVC がコンパイル時にビューを検証する場合、実行前にビューのセット全体を認識している必要があります。コンパイラは、ファイルが存在することを確認します(プロジェクトで適切に参照されています)が、コントローラーのViewResultsによってファイルが適切に参照されているわけではありません。その理由は、ビュー/データを動的に提供するなど、さまざまなことを実行できるようにするためです。すべてのビューがディスクから取得されるわけではありません...たとえば、バイトの MemoryStream から FileResult を返すことを妨げるものは何もありません。別の例として、ビューのセット全体をデータベースに保持し、カスタム ViewEngine をインストールして、データベース レコードから直接レンダリングすることができます。

ViewResult は、バイナリ シーケンス (画像またはファイル)、XML、JSON などを返すなど、ファイル ベースではない他の種類のデータもサポートします。JSON は多くの場合、実行時にメモリ内のオブジェクトから作成されるため、コンパイル時の検証は役に立ちません。

ファイル I/O も遅く、ビューは初期ロード後にメモリにキャッシュされることがよくあります。アプリケーションがコンパイル時にメモリにキャッシュしているものを認識しなければならない場合、キャッシュはあまり柔軟でも有用でもありません。

最終的にいいえ、これを行う簡単な方法はありません。単体テストに当てはまらない単体テストを作成することもできます。これらの単体テストでは、コントローラーの各 ActionMethods を実行し、ViewEngine を呼び出してビューをレンダリングし、ファイルが見つからないというエラーをキャッチします。これは、実質的な努力なしで得ることができるのとほぼ同じです。

ビューのエラーをコンパイル時のエラーにするために、ビューをプリコンパイルできます。既定では、ビューは、MVC アプリが実行されて最初にアクセスされたときに JIT (ジャスト イン タイム コンパイル) されます。.csprojメモ帳またはその他のテキスト エディタでファイルを直接変更すると、に設定されていることがわかります。<MvcBuildViews>設定するfalseだけですtrueが、コンパイル時間が長くなることに注意してください。

于 2013-11-11T04:26:38.097 に答える
0

次のようなモデルがある場合:

public class MyModel
{
    public int MyInt = 0;
}

しかし、あなたのビューは次のことを行います:

@this.Model.MyOtherProperty

これにより、コンパイル時エラーが生成されます (ページが表示されたとき)。ビューが存在しないプロパティにアクセスしようとすると、エラーが発生します。

于 2013-11-11T04:24:31.433 に答える