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
■ /
■ /Shared/EditorTemplates/
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:
■
■ Shared/EditorTemplates/
参照テンプレートについてはDisplayTemplatesの下[20章でこれを使用する例がある]
Master pages
Web Formとほぼ似ています
Partials
RenderPartial method or the Partial method in a parent view
RenderPartialのビュー名のViewsディレクトリでの検索順序:
1 \
2 \Shared\
3\
4\Shared\
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の生成問題を処理し、強いタイプになり、コンパイル時に処理を完了する.