Asp.Netmvc 2 in actionノート-2 View Control

14487 ワード

View


第3、10章

ViewDataと強型ビュー


一般的には、presentation modelを定義し、強いタイプのビューを形成し、ViewDataと組み合わせて小さなセグメントと簡単なデータを転送し、コードのメンテナンス性を向上させることができます.
presentation modelクラスにdata annotationsプロパティを追加し、データの検証を制御できます.

HTML helperクラス


DisplayFor
DisplayTextFor
EditorFor
CheckBoxFor
DropDownListFor
HiddenFor
LabelFor
ListBoxFor
PasswordFor
RadioButtonFor
TextAreaFor
TextBoxFor
ValidateFor
ValidationMessageFor
以上のクラスはSystem.Web.Mvc ..::. HtmlHelperクラスにあります.MSDNドキュメントは詳細を見ることができます.現在、これらのコードは手動で作成したり、T 4を使用して自動的に生成したりすることができます.今後、IDEはWebFormのような可視化サポートを提供すると思います.

強いタイプのテンプレート


観察と編集によって2種類に分けられます
■ Html.Display("Message")
■ Html.DisplayFor(m => m.Message)
■ Html.DisplayForModel()
■ Html.Editor("UserName")
■ Html.EditorFor(m => m.UserName)
■ Html.EditorForModel()
テンプレートの検索順序とカスタマイズ
If the template helper method is used inside an area-specific view, these folders include
//EditorTemplates/.ascx (or .aspx)
/Shared/EditorTemplates/.ascx (or .aspx)
If a template isn’t found in these folders, or if the view isn’t in an area, the default view search locations are used:
/EditorTemplates/.ascx (or .aspx)
■ Shared/EditorTemplates/.ascx (or .aspx)
参照テンプレートについてはDisplayTemplatesの下[20章でこれを使用する例がある]

Master pages


Web Formとほぼ似ています

Partials


RenderPartial method or the Partial method in a parent view
RenderPartialのビュー名のViewsディレクトリでの検索順序:
1 \\.aspx and .ascx
2 \Shared\.aspx and .ascx
3\\.aspx and .ascx
4\Shared\.aspx and .ascx

Building query-string parameter lists


RouteValueDictionaryを処理して、URLを以前のフォーマットのようにします:***?#=##
MVCでのRouterの使用は、既存の古いシステムとの互換性処理が使用されない限り、基本的には使用されません.

View Engine


デフォルトはWeb Formビューエンジン
オープンソースのSparkエンジンは、具体的にはこれを守る文法を使えばよい
MVC 3にはすでにRazorビューエンジンがあり、マイクロソフトPI一体化パッケージにインストールされてデフォルトで作成されたページはRazorが使用されている.

Controller


第4、9、16章
すべてのリクエストはこれによってサービスされます

Post-Redirect-Get (PRG)


フォームのコミットを防止するための問題です.同じビューでコミット結果が表示されると、クライアントがリフレッシュしたときに再コミットされ、データの重複と不一致が発生します.
[HttpPost]
public ActionResult Edit(UserInput input)                   
{
    if (ModelState.IsValid)         
    {
        UpdateUserFromInput(input);                         
        TempData["message"] = "The user was updated";       
        return RedirectToAction("index");          
    }
    return View(input);               
}
private void UpdateUserFromInput(UserInput input)           
{                                                           
    User user =  UserRepository.GetByUsername(input.Username);       
    user.FirstName = input.FirstName;                       
    user.LastName = input.LastName;                         
    UserRepository.Save(user);                              
}

ActionFilter


This extensibility point allows you to intercept the execution of an action and inject behavior before or after the action is executed. This is similar to aspect-oriented programming, which is a technique for applying cross-cutting concerns to a code base without having lots of duplicate code to maintain.
自分で実現するにはActionFilterAttributeから継承すればよい、ログの記録など
ChildActionOnlyAttributeはフレームワークに内蔵されており、この属性のActionを比較するにはHtmlのみである.RenderActionのビューで使用
AuthorizeAttribute

Action selectors


The action selector is used to control which action method is selected to handle a particular route.
System.Web.Mvc ..::. ActionMethodSelectorAttribute
       System.Web.Mvc ..::. AcceptVerbsAttribute
       System.Web.Mvc ..::. HttpDeleteAttribute
       System.Web.Mvc ..::. HttpGetAttribute
       System.Web.Mvc ..::. HttpPostAttribute
       System.Web.Mvc ..::. HttpPutAttribute
       System.Web.Mvc ..::. NonActionAttribute

Action results


Custom action results can be used to remove code that’s duplicated across methods and to extract dependencies that can make an action difficult to test.
ActionResultクラスの直接継承
System.Web.Mvc ..::. ActionResult 
     System.Web.Mvc ..::. ContentResult
     System.Web.Mvc ..::. EmptyResult
     System.Web.Mvc ..::. FileResult FileContentResult

     System.Web.Mvc ..::. HttpUnauthorizedResult
     System.Web.Mvc ..::. JavaScriptResult
     System.Web.Mvc ..::. JsonResult
     System.Web.Mvc ..::. RedirectResult
     System.Web.Mvc ..::. RedirectToRouteResult
     System.Web.Mvc ..::. ViewResultBase
1つのActionReslutを直接実現することで、結果出力CSVファイルなどの共通化が可能になります.
       public class CsvActionResult : ActionResult 
       {
              public IEnumerable ModelListing { get; set; }
 
              public CsvActionResult(IEnumerable modelListing)
              {
                    ModelListing = modelListing;
              }
 
              public override void ExecuteResult(ControllerContext context) 
              {
                    byte[] data = new CsvFileCreator().AsBytes(ModelListing);
                    
                    var fileResult = new FileContentResult(data, "text/csv") 
                    {
                           FileDownloadName = "CsvFile.csv"
                    };
 
                    fileResult.ExecuteResult(context);
              }
       }

主にActionメソッドの戻り時に上記の異なる実装をインスタンス化すればよい.

Routing


URLRewriting
ルートはGlobalに登録する.asax.cs完了
      public static void RegisterRoutes(RouteCollection routes)
        {
            /*  Desired URL schema:
             * 1.  example.com/                     home page
             * 2.  example.com/privacy              static page containing privacy policy
             * 3.  example.com/widgets              show a list of the widgets
             * 4.  example.com/<widget code>           Shows a product detail page for the relevant <widget code>
             * 5.  example.com/<widget code>/buy       Add the relevant widget to the shopping basket
             * 6.  example.com/basket                   Shows the current users shopping basket
             * 7.  example.com/checkout                   Starts the checkout process for the current user
             * 8.  example.com/404                  show a friendly 404 page
             */
 
 
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
            routes.MapRoute("404", "404", new {controller = "Error", action = "NotFound"});
 
            routes.MapRoute("privacy_policy", "privacy", new { controller = "Home", action = "Privacy" });
 
            routes.MapRoute("widget", "{widgetCode}/{action}",
                            new { controller = "Catalog", action = "Show" },
                            new { widgetCode = @"WDG-\d{4}" });
 
            routes.MapRoute("widgets", "widgets", new {controller = "Catalog", action = "index"});
 
            routes.MapRoute("catalog", "{action}",
                            new { controller = "Catalog" },
                            new { action = @"basket|checkout|index" });
 
            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }  // Parameter defaults
            );
 
            routes.MapRoute("404-catch-all", "{*catchall}", new {Controller = "Error", Action = "NotFound"});
        }

ルーティング処理の優先度は上から下であるため,この設計が鍵となる.
URL生成
Html.ActionLink
Html.RouteLink
Url.Action

以上の欠点はパラメータがすべて文字列の形式であることであり,Actionが名前を変えた場合,手動で修正する必要がある.
T 4 MVCは自動化された補助ツールでURLの生成問題を処理し、強いタイプになり、コンパイル時に処理を完了する.