ASP.NET MVC 3学習ノート5(Controller)

10673 ワード

一、操作フィルタ
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の名前です.