MVCパターン
MVC開発モデル
MVCパターンの役割
- 主な設計目標は、ユーザーインターフェイスとロジックレイヤーを分離することです。これにより、開発者はロジックレイヤーの設計とテストに注意を払い、プログラム全体を明確なアーキテクチャにすることができます。
MVCの構成
モーダル(モデルレイヤー)ビュー(ビューレイヤー)コントローラー(コントローラー)
- モデル:モデルオブジェクトは、通常「データモデル」と呼ばれる、アプリケーションデータドメインのロジックを実装するアプリケーションコンポーネントです。モデルオブジェクトはモデルの状態を取得し、データベースに保存します
- ビュー:ビューは、アプリケーションのユーザーインターフェイス(UI)を表示するコンポーネントです。通常、このUIはモデルデータによって作成されます
- コントローラー:コントローラーは、ユーザーの操作を処理し、モデルを使用して、インターフェースを表示するビューを選択するコンポーネントです。MVCアプリケーションでは、ビューに表示されるのはインターフェースのみです。コントローラーは、ユーザー入力とユーザー操作の処理と応答に使用されます。
MVCプログラムのディレクトリ構造
目次 | 説明 |
---|---|
App_Start | アプリケーションの初期化タスクを実行するための複数の静的構成クラスが含まれています |
コンテンツ | アプリケーションの静的コンテンツを配置する |
コントローラ | コントローラーファイルを配置します。コントローラーファイルは、拡張子が.csのファイルです。 |
モデル | データモデルオブジェクトが配置されるファイル |
ビュー | ビューファイルを配置します。ファイル拡張子は.cshtmlまたはaspxです。 |
脚本 | JavaScriptおよびjQueryファイルを配置する |
MVCルーティングとデータ配信
ルーティングの概要:
適切に設計されたURLは、次の要件を満たしている必要があります:
ドメイン名は覚えやすく、綴りやすく、
短く入力
できます。サイトの構造を反映できます。
耐久性があり、変更できません。
- MVCアプリケーションには既にデフォルトのルーティングルール定義があり、コードは./App_Start/ RouteConfig.csファイルにあります
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default", // 路由名称 名称必须唯一
url: "{controller}/{action}/{id}", // URL模式
defaults: new {
controller = "Home", action = "Index", id = UrlParameter.Optional }); // 定义每个路由参数的默认值
}
}
- カスタムルーティングルールを構成する方法
routes.MapRoute(
name: "News",
url: "{controller}/{action}/{year}-{month}-{day}",
defaults: new {
controller = "Home", action = "News", id = UrlParameter.Optional });
URL格式:http://localhost/Home/News/2012-12-21
コントローラはデータをビューに渡します
コントローラーは少量のデータをビューに渡します。一般的なものは次の3つです。
- ViewData:キー/値ペアデータを格納するディクショナリタイプ。ViewDataは1つのHTTPリクエストでのみ有効で、その値はリクエストが終了すると自動的にクリアされます。
- ViewBag:ViewDataと同等ですが、内部実装は完全に異なります。ViewBagは、キーと値のペアのデータではなく、動的な動的タイプのデータを格納します。
- TempData:デフォルトでセッションに保存され、コントローラーは毎回セッションからTempDataを要求してから、セッションをクリアします。この事実に基づいて、各リクエストが終了すると、TempDataのライフサイクルが同時に終了します。
コントローラーの一般的に使用される戻りメソッド
メソッド名 | 説明 |
---|---|
ViewResult | 特定のビューページの8つのオーバーロードを表示する |
RedirectToRoutResult | return RedirectToAction メソッドの結果は、このプロジェクトの他のアクションにジャンプします |
RedirectResult | 返されるRedirectAction 結果の目的は、制限なしでページにジャンプすることです |
FileResult | return File メソッドの結果は、特定のファイルをクライアントに出力することです |
ContentResult | return Content メソッドの目的は文字列を出力することです |
JsonResult | return Json メソッドはオブジェクトをオブジェクトとして出力し Json ます |
JavaScriptResult | return JavaScript メソッドは動的にセクションを出力します js |
HttpStatusCodeResult | 戻りHttpStatusCodeRestult メソッドの動的出力ステータスコード(200、400、500など) |
EFフレームワークを介してリスト
ORMの概要:
- ヘビ
- ORMは「オブジェクトリレーショナルマッピング」の略です
- ORMは、リレーショナルデータベースのデータをオブジェクトの形式で表現し、これらのオブジェクトをオブジェクト指向の方法で整理して、システムのビジネスロジックを実現するプロセスです。
- ORMの具体的な意味
- Oはプログラムのクラスに対応します
- Rはリレーションであり、データベースのリレーショナルテーブルに対応します
- Mは、プログラム内のオブジェクトとデータベース内のリレーショナルテーブルの間のマッピング関係を表します
- エンティティフレームワーク(略してEF)
- ASP.NET MVCアプリケーションに推奨されるORMフレームワーク
- 複数のデータベースをサポート
- マッピングエンジンはストアドプロシージャをサポート
- ビジュアル操作を実行するためのVisual Studio統合ツールを提供する
DBファーストモード
- 最初にデータベース
- 「最初にデータベース」と呼ばれる、つまり最初にデータベースを作成し、次にデータモデルを生成する
- このモードの前提は、データベースがすでに存在し、正常に動作していることです。次に、Visual Studio EFモデルデザイナーを使用して、データベースに基づいてデータモデルを生成します
- ASP.NET MVCアプリケーションでは、すべてのデータモデル関連のクラスはデフォルトで/ Modelsディレクトリに配置されます
- 1. EFウィザードを起動します
- ASP.NET MVCアプリケーションを作成したら、[新しい項目の追加]ダイアログボックスを開き、[データ]を選択し、[ADO.NETエンティティデータモデル]を選択してEFウィザードを開きます。
- 2.データベースの生成
- [追加]ボタンをクリックし、[エンティティデータモデルウィザード]ダイアログボックスで、[データベースから生成(データベースからEF Designer)]を選択します。
- 3.データベース接続
- [次へ]をクリックし、[エンティティデータモデルウィザード]ダイアログボックスでデータベース接続を作成して、[DBName]データベースに接続します。EFウィザードが接続文字列を自動的に生成します
- 4.データシート(必要なデータシートを確認してください)
- 5. [完了]をクリックします
データベースコンテキストオブジェクトDBContext
- EFウィザードによって自動的に生成された「データベースコンテキスト操作クラス」と呼ばれるDBTESTEntitiesクラスは、次の場所にあります。
/Models/Model1.Context.cs
- 生成された部門、従業員クラスは「ビジネスエンティティクラス」と呼ばれます
.edmxファイルは、概念モデル、ストレージモデル、およびこれらのモデル間のマッピングを定義するために使用されるXMLファイルです
。SSDLストレージモデル、データベース内のエンティティ(各エンティティとテーブルの関係を固定する形式)
CSDL概念モデル、角度で定義された手続き型言語モデル。エンティティ定義、主キー、属性などが.NET Frameworkタイプの
マッピングに対応して関連付けられ、概念モデルとストレージモデルを接続して、操作を実行します。つまり、エンティティ属性(概念モデル)対応するエンティティ。フィールド(ストレージモデル)
かみそりの構文
- かみそり
- コード言語ではなく、ビューで使用されるコードエンジン
- 簡潔なクライアントのような文法構造を持つWebサーバー側コード関数を提示します
- ASPXページの "<%…%>"コードブロック構文を置き換えます
- 執筆の始めに「@」を使用し、「@」はRazorロゴです
- @ … @ Razorアノテーション
Razor構文データ処理はサーバー側で行われます
Razor構文には3つの形式があります。
@表达式
通常、
@(表达式)
混合長形式
@{ C#代码块(混HTML) }
がコレクションデータブロックのフォーマットされた表示を処理するために使用されます。
ストロングタイプ
- 変数が定義されたときに、その型が明確に指定されていることを意味します。「強いタイプ」と比較して「弱いタイプ」(オブジェクトタイプは「弱いタイプ」に属します)
型番
- デフォルトでは、ビューのModelプロパティは表示コードから直接アクセスでき、動的なタイプです。ただし、開発ビューの効率と精度を向上させるために、モデルの特定のタイプを明示的に指定し、「厳密に型指定された」データ(厳密な型は可能。属性名を出力)を使用して、厳密な型宣言を行うことができます。
@model 模型对象(集合)
EFフレームワークを通じて追加する
HTMLヘルパー出力フォーム
- 出力ハイパーリンクの書き込み:
@Html.ActionLink("LinkText","ActionLinkName")
@Html.ActionLink("LinkText","ActionLinkName","ControllerName")
@Html.ActionLink("LinkText","ActionLinkName",new{id=xxx,page=z})
- ASP.NET MVCフレームワークには、複数のフォームに関連する組み込みのHTML補助メソッドがあります
HTMLヘルパー | 説明 |
---|---|
Html.BeginForm() | 出力<form> ラベル |
Html.CheckBox() | 出力<input type="checkbox"> ラベル |
Html.DropDownList() | 出力<select> ラベル |
Html.Password() | 出力<input type="password"> ラベル |
Html.RadioButton() | 出力<input type="radio"> ラベル |
Html.TextArea() | 出力<textarea> ラベル |
Html.TextBox() | 出力<input type="text"> ラベル |
EFフレームワークによるデータの追加
データベースコンテキストクラスは、ビジネスエンティティオブジェクトの変更を追跡および識別するために使用され、データベースアクセス操作のエントリポイントです。このクラスがないと、EFは機能しません。次のコードは疑似コードです
public partial class DBTESTEntities: DbContext // EF框架可自动生成,一般无需改动
{
public EntityTEntities ()
: base("name=EntityTEntities") // 关联数据库连接串
{
}
//用于在上下文对象初始化后执行相关的配置操作
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
//业务实体类
public DbSet<Entity> Entity {
get; set; }
}
public class HomeController : Controller
{
public ActionResult Index()
{
Entity entity = new Entity() // 实例化实体对象
{
FieldName = Request["FieldName"]
};
// using语句可自动释放 数据库上下文对象 占用的数据库资源
using (DBNameTEntities db = new DBNameTEntities())
{
db.Dept.Add(entity); // 将数据添加进实体上下文
db.SaveChanges(); // 将更改保存数据库
}
return View();
}
}
MVCアップロードファイル
public ActionResult UploadFile(HttpPostedFileBase fileName) // 暂不做文件类型判断
{
fileName.SaveAs(Request.MapPath("~/upload/") + fileName);
return Content("OK");
}
- ファイルタイプの判断は、ファイルサフィックス名ではなく、名前のバイナリコードに基づいています
拡張子名 | バイナリコード |
---|---|
JPG | 255216 |
GIF | 7173 |
BMP | 6677 |
PNG | 13780 |
RAR | 8297 |
jpg | 255216 |
EXE | 7790 |
xml | 6063 |
html | 6033 |
aspx | 239187 |
cs | 117115 |
js | 119105 |
txt | 210187 |
SQL | 255254 |