ASP.NET MVC 3学習ノート5(Controller)
10673 ワード
一、操作フィルタ
1つの操作方法が選択されるとすぐに実行され、結果が返されると、返された結果も実行されます.オペレーションフィルタを使用すると、開発者は、ライセンス、オペレーション前後処理、結果前後処理、エラー処理の4つの方法でオペレーションと結果実行パイプ権に参加できます.
A、MVCで認証を処理する:
たとえば、次のページにアクセスするには、ログインする必要があります.
まず、認証ログインに成功した後、手形情報を保存します.
検証が必要なactionに検証のfilterを加えればよい
コントローラ全体のactionがログインするかどうかを検証する必要がある場合は、controllerに直接検証マークを付けるといいです.
ここでは、空のsupercontrollerをベースクラスのcontrollerとして使用できます.これにより、他のすべてのcontrollerがsupercontrollerから継承されると、対応する権限を検証できます.
B、操作前後処理、結果前後処理、エラー処理
操作前後処理:IActionFilter
結果前後処理:IresultFilter
エラー処理:IExceptionFilter
カスタムAttributeを実装するには、FilterAttributeを継承し、上記の3つのfilterのうちの1つを実装する必要があります.
例えば、我々がエラー処理を実現したIExceptionFilter
使用する場合はライセンスフィルタと同様にactionに[CatchException]を付けるとよい.
基本的にはcontrollerでtry catch操作をしないでログファイルに異常を書くことができます.同じ理屈でsupercontrollerに書かれたベースクラスの効果はもっと良いです.
二、カスタムの返却結果を実現する
たとえば、actionを実行するときにreturn View()という書き方を返します.これはシステムが定義しているので、自分が定義したView Resultに戻りたい場合は、クラス継承ActionRuesultを定義すればいいです.
この場合、return XmlResult(Obj)を使用してエンティティオブジェクトをxml形式に変換し、Viewテンプレートに戻ることができます.
三、カスタムViewテンプレートベースクラス
私たちのViewの下のcshtmlはSystemから受け継がれています.Web.Mvc.WebViewPageクラスは、独自のビューベースクラスを定義することもできます.
たとえば、CustomWebViewPageを定義します.
私たちを指すViewでいいです.
Viewsファイルにwebがあります.config【プロジェクトソリューションの下のweb.configではありません】
PageBaseTypeをさっきカスタマイズしたpageに変更すればいいです.responseリクエストがあると自動的にcustomwebviewpageに進みます.
四、コントローラの別の使い方
一般的にはcontrollerでactionを定義し、actionresultを返す操作はありません.実際には、次のように定義することもできます.
同様に/Super/Indexにもアクセスできます.上記のカスタムactionresultを思い出すと、ActionResultに戻るのはrespnnesの戻りを正規化していることがわかります.
ActionResultの構造図と具体的な機能説明については参照http://www.cnblogs.com/mecity/archive/2011/06/29/2092042.html
非同期コントローラ
私たちが一般的に使っているControllerは同期操作をサポートするControllerです.例えば、私たちのページには3つの接続があり、各接続の実行操作は2 sで、同期操作は6 sのページ全体を待ってからロードします.非同期操作を使うと2 sで完了します.非同期のControllerは実際の応用の中で、主にいくつかのページの要求が多すぎる時、非同期のロードを採用して、もちろんサーバーの負荷を増加します;
一般的なControllerは直接Controllerを継承します.非同期のControllerであればAsyncControllerを継承します.
私たちが訪問するときは/Test 1/Newsを通過するだけでいいです.そして私たちが最終的に要求に応答したのはNewsCompletedというActionだけで、中のパラメータはNewsAsyncで定義されたパラメータグループnewsの名前です.
1つの操作方法が選択されるとすぐに実行され、結果が返されると、返された結果も実行されます.オペレーションフィルタを使用すると、開発者は、ライセンス、オペレーション前後処理、結果前後処理、エラー処理の4つの方法でオペレーションと結果実行パイプ権に参加できます.
A、MVCで認証を処理する:
たとえば、次のページにアクセスするには、ログインする必要があります.
まず、認証ログインに成功した後、手形情報を保存します.
public ActionResult SaveKey()
{
FormsAuthentication.SetAuthCookie("Admin", false);
}
検証が必要なactionに検証のfilterを加えればよい
[Authorize]
public ActionResult Index()
{
ViewBag.Message = " ASP.NET MVC!";
return View();
}
コントローラ全体のactionがログインするかどうかを検証する必要がある場合は、controllerに直接検証マークを付けるといいです.
[Authorize(Users="Admin")]
public class SuperController:Controller
{
}
ここでは、空のsupercontrollerをベースクラスのcontrollerとして使用できます.これにより、他のすべてのcontrollerがsupercontrollerから継承されると、対応する権限を検証できます.
B、操作前後処理、結果前後処理、エラー処理
操作前後処理:IActionFilter
結果前後処理:IresultFilter
エラー処理:IExceptionFilter
カスタムAttributeを実装するには、FilterAttributeを継承し、上記の3つのfilterのうちの1つを実装する必要があります.
例えば、我々がエラー処理を実現したIExceptionFilter
public class CatchException : FilterAttribute, IExceptionFilter
{
public static readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public void OnException(ExceptionContext filterContext)
{
log.Debug(" ", filterContext.Exception);
}
}
使用する場合はライセンスフィルタと同様にactionに[CatchException]を付けるとよい.
基本的にはcontrollerでtry catch操作をしないでログファイルに異常を書くことができます.同じ理屈でsupercontrollerに書かれたベースクラスの効果はもっと良いです.
二、カスタムの返却結果を実現する
たとえば、actionを実行するときにreturn View()という書き方を返します.これはシステムが定義しているので、自分が定義したView Resultに戻りたい場合は、クラス継承ActionRuesultを定義すればいいです.
public class XmlResult:ActionResult
{
private object data;
public XmlResult(object data) {
this.data = data;
}
public override void ExecuteResult(ControllerContext context)
{
var serializer = new XmlSerializer(data.GetType());
var response = context.HttpContext.Response.OutputStream;
context.HttpContext.Response.ContentType = "text/xml";
serializer.Serialize(response, data);
}
}
この場合、return XmlResult(Obj)を使用してエンティティオブジェクトをxml形式に変換し、Viewテンプレートに戻ることができます.
三、カスタムViewテンプレートベースクラス
私たちのViewの下のcshtmlはSystemから受け継がれています.Web.Mvc.WebViewPageクラスは、独自のビューベースクラスを定義することもできます.
たとえば、CustomWebViewPageを定義します.
public abstract class CustomWebViewPage:WebViewPage
{
public override HttpResponseBase Response
{
get
{
base.Context.Response.Write("this is test");
return base.Response;
}
}
public override void Execute()
{
}
}
私たちを指すViewでいいです.
Viewsファイルにwebがあります.config【プロジェクトソリューションの下のweb.configではありません】
<pages pageBaseType="MVC3Pro.Controllers.CustomWebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
namespaces>
pages>
PageBaseTypeをさっきカスタマイズしたpageに変更すればいいです.responseリクエストがあると自動的にcustomwebviewpageに進みます.
四、コントローラの別の使い方
一般的にはcontrollerでactionを定義し、actionresultを返す操作はありません.実際には、次のように定義することもできます.
public class SuperController:Controller
{
public void Index() {
Response.Write("this is super");
}
}
同様に/Super/Indexにもアクセスできます.上記のカスタムactionresultを思い出すと、ActionResultに戻るのはrespnnesの戻りを正規化していることがわかります.
ActionResultの構造図と具体的な機能説明については参照http://www.cnblogs.com/mecity/archive/2011/06/29/2092042.html
非同期コントローラ
私たちが一般的に使っているControllerは同期操作をサポートするControllerです.例えば、私たちのページには3つの接続があり、各接続の実行操作は2 sで、同期操作は6 sのページ全体を待ってからロードします.非同期操作を使うと2 sで完了します.非同期のControllerは実際の応用の中で、主にいくつかのページの要求が多すぎる時、非同期のロードを採用して、もちろんサーバーの負荷を増加します;
一般的なControllerは直接Controllerを継承します.非同期のControllerであればAsyncControllerを継承します.
public class Test1Controller : AsyncController
{
public void NewsAsync()
{
AsyncManager.OutstandingOperations.Increment();
AsyncManager.Parameters["news"] = "test";
AsyncManager.OutstandingOperations.Decrement();
Thread.Sleep(2000);
}
public ActionResult NewsCompleted(string news)
{
return Content(news);
}
}
私たちが訪問するときは/Test 1/Newsを通過するだけでいいです.そして私たちが最終的に要求に応答したのはNewsCompletedというActionだけで、中のパラメータはNewsAsyncで定義されたパラメータグループnewsの名前です.