目次
Index
ホームページ バックエンド開発 C#.Net チュートリアル [ASP.NET MVC Mavericks Road] 09 - コントローラーとアクション (1)

[ASP.NET MVC Mavericks Road] 09 - コントローラーとアクション (1)

Dec 30, 2016 pm 04:00 PM

[ASP.NET
MVC Mavericks Road] 09 - コントローラーとアクション (1)

MVC では、各リクエストが処理のためにコントローラーに送信されることがわかっています。コントローラーにはリクエストのロジック処理が含まれており、モデルを操作したり、ユーザーに提示するビューを選択したりできます。通常、ビジネスやデータ、インターフェイス、補助クラス ライブラリなどのロジック コードは配置されません。コントローラー。

ControllerとActionは内容が多いので2記事に分けました、もしくは3記事に分ける場合もあります。この記事では、コントローラーの実装、コントローラーによるステータス データの取得、ActionResult と Action のデータ転送について説明します。その後、コントローラー ファクトリ、アクション インボーカー、およびまだ考えられていない高度な機能をいくつか紹介します。学習されています。

この記事の内容


IController インターフェイスを継承する

このシリーズの前の記事で、追加したコントローラーは、抽象クラス System.Web.Mvc.Controller から継承された共通クラスです (注意:コントローラーこの記事では (またはコントローラー) とコントローラー クラスの 2 つの異なる意味があります。この記事を読む際は文脈に応じて理解してください)。コントローラー抽象クラスは、多くの非常に実用的な関数をカプセル化しているため、開発者は反復的で面倒な処理コードを自分で記述する必要がありません。

カプセル化されたコントローラー抽象クラスを使用しない場合は、IController インターフェイスを実装して独自のコントローラーを作成することもできます。 IController インターフェイスには Exctute メソッドが 1 つだけあります:

public interface IController { 
    void Execute(RequestContext requestContext); 
}
ログイン後にコピー

Controller インターフェイスは System.Web.Mvc 名前空間の下にあり、非常に単純な構造を持つインターフェイスです。

IController インターフェイスを実装するコントローラー クラスにリクエストが送信されると (ルーティング システムはリクエストされた URL を通じてコン​​トローラーを見つけることができます)、Execute メソッドが呼び出されます。

次に、空の MVC アプリケーションを作成し、Controllers フォルダーの下に IController を実装するクラスを追加し、次のようにいくつかの簡単な操作を実行します。

using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.Controllers {
    public class BasicController : IController {
        
        public void Execute(RequestContext requestContext) {
            
            string controller = (string)requestContext.RouteData.Values["controller"];
            string action = (string)requestContext.RouteData.Values["action"];
            
            requestContext.HttpContext.Response.Write(
                string.Format("Controller: {0}, Action: {1}", controller, action));
        }
    }
}
ログイン後にコピー

アプリケーションを実行すると、URL は /Basic/Index にあります ( Index を他のフラグメント名に変更できます)、結果は次のようになります:

[ASP.NET MVC Mavericks Road] 09 - コントローラーとアクション (1)

は IController クラスを実装し、MVC はそれをコントローラー クラスとして認識し、対応するリクエストをこのクラスに渡して、コントローラー名。

しかし、少し複雑なアプリケーションの場合、IController インターフェイスを自分で実装するには多大な作業が必要であり、それを行うことはほとんどありません。これにより、コントローラーのすべてのリクエスト処理が Execute メソッドから開始されることが理解できます。


Controller抽象クラスを継承します

MVCでは自由にカスタマイズ、拡張することができます。例えば、前述のように、IControllerインターフェイスを実装して、さまざまなリクエストに対してさまざまな処理を作成し、結果を生成できます。 Action メソッドが気に入らない場合、または View を気にしない場合は、リクエストを処理するための、より優れた、より高速で洗練されたコントローラーを自分で作成できます。ただし、前述したように、IController インターフェイスを自分で実装するには多くの作業が必要です。最も重要なことは、長期にわたる実践的なテストがなければコードの堅牢性を保証できないということです。これは一般的に推奨されません。 MVC フレームワークの System.Web.Mvc.Controller クラスは、リクエストの処理と結果の返しを容易にするのに十分な実用的な機能を提供します。

私たちは、Controller クラスを継承するコントローラーを何度も使用しており、次の主要な機能を備えています。

Action メソッド: コントローラー、その動作は複数のメソッドに分割されます。通常、メソッドは に対応します。リクエストによって渡されるデータは、メソッドのパラメータを通じて取得できます。
ActionResult: Action メソッドの実行結果を記述するオブジェクトを返すことができます。これの利点は、どのような結果を返したいかについて、対応する戻りオブジェクトを指定するだけで済み、心配する必要がないことです。それを実行して結果を生成する方法。
フィルター: C# 機能を通じて、特定の動作 (承認や検証など) の処理がカプセル化され、複数のコントローラーおよびアクション メソッド間での再利用が容易になります。

したがって、特別なニーズがない場合、または忙しすぎる場合、要件を満たすコントローラーを作成する最良の方法は、コントローラー抽象クラスを継承することです。これまでに何度も使用しているため、ここでは詳細なデモは行いませんが、コード構造を見てみましょう。

Controllers フォルダーにコントローラーを追加します。VS はすでにクラス構造を生成しています。コードは次のとおりです。

using System.Web.Mvc;

namespace MvcApplication1.Controllers {
    
    public class DerivedController : Controller {
        
        public ActionResult Index() {
            ViewBag.Message = "Hello from the DerivedController Index method";
            return View("MyView");
        }
    }
}
ログイン後にコピー

我们可以查看 Controller 抽象类的定义,发现它是继承 ControllerBase 类的,在 ControllerBase 类中实现了 IController 接口的 Execute 方法,这个方法是MVC对请求进行处理的各个组件的入口,其中包括通过路由系统找到 Action 方法并调用。

Controller 类内部使用 Razor 视图系统来呈现 View,这里通过 View 方法,指定 View 的名称参数来告诉 MVC 选择 MyView 视图来返回给用户结果。


在 Controller 中获取状态数据

我们经常需要访问客户端提交过来的数据,比如 QueryString 值、表单值和通过路由系统来自 URL 的参数值,这些值都可称为状态数据。下面是 Controller 中获取状态数据的三个主要来源:

一系列的上下文对象。
传递给 Action 方法的参数。
显式的调用框架的模型绑定(Model Binding)特性。

从上下文对象中获取状态数据

获取状态数据最直接的方法就是从上下文对象中提取。当你创建了一个继承自 Controller 类的 Controller 时,可以通过一系列的属性可以方便的访问到和请求相关的数据,这些属性包括 Request、Response、RouteData、HttpContext 和 Server,每一个都提供了请求相关的不同类型的信息。下面列出了最常的上下文对象:


[ASP.NET MVC Mavericks Road] 09 - コントローラーとアクション (1)

在 Action 方法中可以使用任意上下文对象来获取请求相关的信息,如下面在 Action 方法中所演示的:

...
public ActionResult RenameProduct() {
    //访问不同的上下文对象
    string userName = User.Identity.Name;
    string serverName = Server.MachineName;
    string clientIP = Request.UserHostAddress;
    DateTime dateStamp = HttpContext.Timestamp;
    AuditRequest(userName, serverName, clientIP, dateStamp, "Renaming product");
            
    //从POST请求提交的表单中获取数据
    string oldProductName = Request.Form["OldName"];
    string newProductName = Request.Form["NewName"];
    bool result = AttemptProductRename(oldProductName, newProductName);

    ViewData["RenameResult"] = result;
    return View("ProductRenamed");
}
...
ログイン後にコピー

这些上下对象不用特意去记,用的时候,你可以通过VS的智能提示来了解这些上下文对象。

使用 Action 方法参数获取状态数据

在本系列的前面的文章中,我们已经知识如何通过 Action 参数来接收数据,这种方法和上面的从上下文对象中获取相比,它更为简洁明了。比如,我们有下面这样一个使用上下文对象的 Action 方法:

public ActionResult ShowWeatherForecast() {
    string city = (string)RouteData.Values["city"];
    DateTime forDate = DateTime.Parse(Request.Form["forDate"]);
    // do something ... 
    return View();
}
ログイン後にコピー

我们可以像下面这样使用 Action 方法参数来重写它:

public ActionResult ShowWeatherForecast(string city, DateTime forDate) { 
    // do something ... 
    return View(); 
}
ログイン後にコピー

它不仅易读性强,也方便进行单元测试。

Action 方法的参数不允许使用 ref 和 out 参数,这是没有意义的。

MVC 框架通过检查上下文对象来为 Action 方法的参数提供值,它的名称是不区分大小写的,比如 Action 方法的 city 参数的值可以是通过 Request.Form["City"] 来获取的。

理解 Action 方法的参数是如何被赋值的

Controller 类通过 MVC 框架的 value provider 和 model binder 组件来为 Action 方法获取参数的值。

value provider 提供了一系列Controller中可以访问到的值,在内部它通过从 Request.Form、Request.QueryString、Request.Files 和 RouteData.Values 等上下文对象中提取数据(键值集合),然后把数据传递给 model binder,model binder 试图将这些数据与Action方法的参数进行匹配。默认的 model binder 可以创建和赋值给任何.NET类型对象参数(即 Action 方法的参数),包括集合和自定义的类型。

在这不对 model binder 进行介绍,我将在本系列的后续博文中对其进行专门的介绍。


理解 ActionResult

ActionResult 是描述 Action 方法执行结果的对象,它的好处是想返回什么结果就指定对应的返回对象就行,不用关心如何使用Response对象来组织和生成结果。ActionResult 是一个命令模式的例子,这种模式通过存储和传递对象来描述操作。

当 MVC 框架从 Action 方法中接收到一个 ActionResult 对象,它调用这个对象的 ExecuteResult 方法,其内部是通过 Response 对象来返回我们想要的输出结果。

为了更好的理解,我们通过继承 ActionResult 类来自定义一个 ActionResult。在MVC工程中添加一个Infrastructure文件夹,在里面创建一个名为 CustomRedirectResult 的类文件,代码如下:

using System.Web.Mvc;

namespace MvcApplication1.Infrastructure {
    
    public class CustomRedirectResult : ActionResult {
        
        public string Url { get; set; }

        public override void ExecuteResult(ControllerContext context) {
            string fullUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
            context.HttpContext.Response.Redirect(fullUrl);
        }
    }
}
ログイン後にコピー

当我们创建一个 CustomRedirectResult 类的实例时,我们可以传递想要跳转的 URL。当 Action 方法执行结束时,MVC 框架调用 ExecuteResult 方法,ExecuteResult 方法通过 ControllerContext 对象获得 Response 对象,然后调用 Redirect 方法。

下面我们在 Controller 中使用自定义的 CustomRedirectResult:

public class DerivedController : Controller {
    ...
    public ActionResult ProduceOutput() {
        if (Server.MachineName == "WL-PC") {
            return new CustomRedirectResult { Url = "/Basic/Index" };
        }
        else {
            Response.Write("Controller: Derived, Action: ProduceOutput");
            return null;
        }
    }
ログイン後にコピー

运行后我们看到如下结果:

[ASP.NET MVC Mavericks Road] 09 - コントローラーとアクション (1)

当运行在本机(WL-PC)时直接重定向到了指定的/Basic/Index。

上面我们通过自定义 CustomRedirectResult 来实现重定向,我们可以用 MVC 框架提供的方法,如下:

... 
public ActionResult ProduceOutput() { 
    return new RedirectResult("/Basic/Index"); 
}
ログイン後にコピー

为了使用方便,Controller 类中为大部分类型的 ActionResult 提供简便的方法,如上面的可像下面这样简写:

... 
public ActionResult ProduceOutput() { 
    return Redirect("/Basic/Index"); 
}
ログイン後にコピー

MVC框架包含了许多 ActionResult 类型,这些类型都继承自 ActionResult 类,大部分在 Controller 类中都有简便的方法,下面列举了一些:

[ASP.NET MVC Mavericks Road] 09 - コントローラーとアクション (1)

除了该表列出来的,还有ContentResult、FileResult、JsonResult 和 JavaScriptResult。具体每种ActionResult类型的用法这里就不讲了,大家可以看看蒋老师的了解ASP.NET
MVC几种ActionResult的本质系列的文章。


几种从 Action 传递数据到 View 的方式

我们经常需要在 Action 方法中传递数据到一个 View 中,MVC 框架为此提供了一些很方便的操作。下面简单简介几种常用的方式。

View Model 对象

通过 View Model 对象传递数据给View,这是最常用的一种,在 Acton 方法执行结束时通过 View 方法传递 View Model 对象给 View,如下代码所示:

... 
public ViewResult Index() { 
    DateTime date = DateTime.Now; 
    return View(date); 
}
ログイン後にコピー

在 View 中我们通过 Model 属性来使用传递过来的 View Model 对象,如下:

@model DateTime 

@{ 
    ViewBag.Title = "Index"; 
}

<h2 id="Index">Index</h2> 
The day is: @Model.DayOfWeek
ログイン後にコピー

在 Razor 视图引擎中,@model 的作用是声明 odel 属性的类型,省去了类型转换的麻烦,而 @Model 是V iew Model 对象的引用。

ViewBag、ViewData 和 TempData 属性

ViewBag、ViewData 和 TempData 都是 Controller 和 View 中能访问到的属性,都是用来存储小量的数据,他们的区别如下:

ViewBag,是一个动态(dynamic)的弱类型,在程序运行的时候解析,是 MVC3 中新增的特性,只在当前View有效。
ViewData,是一个字典集合,也是只在当前View有效,性能比 ViewBag 高,但是使用的时候需要类型转换。
TempData,也是字典集合,一般用于两个请求之间临时缓存内容或页面间传递消息,保存在 Session 中,使用完以后则从 Session 中被清除。

下面是三者使用的例子,先在 Controller 中分别用三者存储小数据:

public class DerivedController : Controller {

    public ActionResult Index() {
        ViewBag.DayOfWeek = DateTime.Now.DayOfWeek;
        ViewData["DayOfMonth"] = DateTime.Now.Day;
        return View();
    }

    public ActionResult ProduceOutput() {
        TempData["Message"] = "Warning message from Derived Controller.";
        return Redirect("/Home/Index");
    }
}
ログイン後にコピー

在 Views/Derived 目录下的 Index.cshtml 中,取出 ViewBag 和 ViewData 中的存储的数据:

...
Day of week from ViewBag: @ViewBag.DayOfWeek
<p /> 
Day of month from ViewData: @ViewData["DayOfMonth"]
ログイン後にコピー

在 Views/Home 目录下的 Index.cshtml 中,取 TempData 中的数据如下:

...
@TempData["Message"]
ログイン後にコピー

当请求 /Derived/ProduceOutput 时,ProduceOutput 方法将一条消息存到 TempData 中,并跳转到 /Home/Index。

下面是分别是将URL定位到 /Derived/Index 和 /Derived/ProduceOutput 时的结果:

[ASP.NET MVC Mavericks Road] 09 - コントローラーとアクション (1)

[ASP.NET MVC Mavericks Road] 09 - コントローラーとアクション (1)

一般在当前 View 中使用 ViewBag 或 ViewData,在两个请求之间传递临时数据用 TempData。由于 TempData 被使用后即被释放,所以如果要二次使用 TempData 中的数据就需要将其存到其他变量中。

 以上就是[ASP.NET MVC 小牛之路]09 - Controller 和 Action (1)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP MVC アーキテクチャ: 将来に向けた Web アプリケーションの構築 PHP MVC アーキテクチャ: 将来に向けた Web アプリケーションの構築 Mar 03, 2024 am 09:01 AM

はじめに 今日の急速に進化するデジタル世界では、堅牢かつ柔軟で保守可能な WEB アプリケーションを構築することが重要です。 PHPmvc アーキテクチャは、この目標を達成するための理想的なソリューションを提供します。 MVC (Model-View-Controller) は、アプリケーションのさまざまな側面を独立したコンポーネントに分離する、広く使用されている設計パターンです。 MVC アーキテクチャの基礎 MVC アーキテクチャの核となる原則は、関心事の分離です。 モデル: アプリケーションのデータとビジネス ロジックをカプセル化します。ビュー: データの表示とユーザー インタラクションの処理を担当します。コントローラー: モデルとビュー間の対話を調整し、ユーザーのリクエストとビジネス ロジックを管理します。 PHPMVC アーキテクチャ phpMVC アーキテクチャは従来の MVC パターンに従いますが、言語固有の機能も導入しています。以下はPHPMVCです

PHP MVC アーキテクチャの上級ガイド: 高度な機能のロックを解除する PHP MVC アーキテクチャの上級ガイド: 高度な機能のロックを解除する Mar 03, 2024 am 09:23 AM

MVC アーキテクチャ (モデル-ビュー-コントローラー) は、コードを編成し、WEB アプリケーションの開発を簡素化するための明確な構造を提供するため、PHP 開発で最も一般的なパターンの 1 つです。基本的な MVC 原則はほとんどの Web アプリケーションには十分ですが、複雑なデータを処理したり高度な機能を実装する必要があるアプリケーションにはいくつかの制限があります。モデル層の分離 モデル層の分離は、高度な MVC アーキテクチャでは一般的な手法です。これには、モデル クラスを小さなサブクラスに分割し、それぞれが特定の機能に焦点を当てることが含まれます。たとえば、電子商取引アプリケーションの場合、メイン モデル クラスを注文モデル、製品モデル、顧客モデルに分割できます。この分離により、コードの保守性と再利用性が向上します。依存関係注入を使用する

PHPを使用してMVCパターンを実装する方法 PHPを使用してMVCパターンを実装する方法 Jun 07, 2023 pm 03:40 PM

MVC (Model-View-Controller) パターンは、開発者がコードをより適切に整理および管理するのに役立つ、一般的に使用されるソフトウェア設計パターンです。 MVC パターンは、アプリケーションをモデル、ビュー、コントローラーの 3 つの部分に分割し、各部分には独自の役割と責任があります。この記事では、PHP を使用して MVC パターンを実装する方法について説明します。モデル モデルは、アプリケーションのデータとデータ処理を表します。いつもの、

SpringMVC フレームワークの成功を明らかにする: なぜこれほど人気が​​あるのか SpringMVC フレームワークの成功を明らかにする: なぜこれほど人気が​​あるのか Jan 24, 2024 am 08:39 AM

SpringMVC フレームワークの解読: なぜこれほど人気が​​あるのか​​、具体的なコード例が必要です はじめに: 今日のソフトウェア開発分野では、SpringMVC フレームワークは開発者の間で非常に人気のある選択肢となっています。これは、MVC アーキテクチャ パターンに基づいた Web フレームワークであり、柔軟で軽量、効率的な開発方法を提供します。この記事では、SpringMVC フレームワークの魅力を掘り下げ、具体的なコード例を通じてその威力を実証します。 1. SpringMVCフレームワークのメリット 柔軟な構成方法 Spr

MVC アーキテクチャを使用して PHP でプロジェクトを設計する方法 MVC アーキテクチャを使用して PHP でプロジェクトを設計する方法 Jun 27, 2023 pm 12:18 PM

Web 開発では、MVC (Model-View-Controller) は、アプリケーションのデータ、ユーザー インターフェイス、および制御ロジックを処理および管理するために一般的に使用されるアーキテクチャ パターンです。人気の Web 開発言語である PHP は、MVC アーキテクチャを使用して Web アプリケーションを設計および構築することもできます。この記事では、MVC アーキテクチャを使用して PHP でプロジェクトを設計する方法を紹介し、その利点と注意点について説明します。 MVCMVC とは、Web アプリケーションで一般的に使用されるソフトウェア アーキテクチャ パターンです。 MV

PHP8 フレームワークを使用した MVC の開発: 初心者が知っておくべき重要な概念とテクニック PHP8 フレームワークを使用した MVC の開発: 初心者が知っておくべき重要な概念とテクニック Sep 11, 2023 am 09:43 AM

PHP8 フレームワークによる MVC の開発: 初心者が知っておくべき重要な概念とテクニック はじめに: インターネットの急速な発展に伴い、Web 開発は今日のソフトウェア開発業界で重要な役割を果たしています。 PHP は Web 開発に広く使用されており、開発者がアプリケーションをより効率的に構築できるようにする成熟したフレームワークが多数あります。その中でも、MVC (Model-View-Controller) アーキテクチャは、最も一般的で広く使用されているパターンの 1 つです。この記事では、初心者が PHP8 フレームワークを使用して MVC アプリケーションを開発する方法を紹介します。

PHP8 フレームワークを使用した MVC の開発: ステップバイステップ ガイド PHP8 フレームワークを使用した MVC の開発: ステップバイステップ ガイド Sep 11, 2023 am 10:05 AM

PHP8 フレームワークによる MVC の開発: ステップバイステップ ガイド はじめに: MVC (Model-View-Controller) は、アプリケーションのロジック、データ、およびユーザー インターフェイスを分離するために使用される、一般的に使用されるソフトウェア アーキテクチャ パターンです。これは、コードの管理と保守を改善するために、アプリケーションを 3 つの異なるコンポーネントに分離する構造を提供します。この記事では、PHP8 フレームワークを使用して MVC パターンに準拠するアプリケーションを開発する方法を検討します。ステップ 1: MVC パターンを理解する MVC アプリケーションの開発を開始する前に、

PHP MVC アーキテクチャの秘密を明らかにする: Web サイトを飛躍的に動かす PHP MVC アーキテクチャの秘密を明らかにする: Web サイトを飛躍的に動かす Mar 03, 2024 am 09:25 AM

モデル ビュー コントローラー (mvc) アーキテクチャは、保守可能でスケーラブルな WEB アプリケーションを構築するための強力な設計パターンです。 PHPMVC アーキテクチャは、アプリケーション ロジックを 3 つの異なるコンポーネントに分解します。 モデル: アプリケーション内のデータとビジネス ロジックを表します。ビュー: ユーザーにデータを表示する責任を負います。コントローラー: モデルとビューの間のブリッジとして機能し、ユーザーのリクエストを処理し、他のコンポーネントを調整します。 MVC アーキテクチャの利点: コード分離: MVC はアプリケーション ロジックをプレゼンテーション層から分離し、保守性と拡張性を向上させます。再利用性: ビューとモデルのコンポーネントはさまざまなアプリケーション間で再利用できるため、コードの重複が削減されます。パフォーマンスの最適化: MVC アーキテクチャにより、ビューとモデルの結果をキャッシュできるため、Web サイトの速度が向上します。テストしやすい: 分遣隊

See all articles