ASP.NET MVC Framework体験(4):コントローラ
9833 ワード
概要
MVCでは,Controllerはユーザのインタラクションを処理して応答するために用いられ,どのViewを用いて表示するか,どのようなビューデータをビューに渡す必要があるかなどを選択する.ASP.NET MVC Frameworkでは、IControllerインタフェースとControllerベースクラスの2種類が用意されています.ここで、Controllerでは、正しいactionを特定して実行したり、actionメソッドのパラメータに値を付けたり、実行中のエラーを処理したり、デフォルトのWebFormViewFactoryプレゼンテーションページを提供したりするMVCでよく使われる処理が提供されています.IControllerはコントローラのインタフェースを提供しているだけで、ユーザーがコントローラをカスタマイズしたい場合は、IControllerを実現することができます.その定義は以下の通りです.
public interface IController
{
void Execute(ControllerContext controllerContext);
}
コントローラとアクションの定義
前の3つの例では、コントローラを定義しました.Controllerに継承すればいいです.
public class BlogController : Controller
{
[ControllerAction]
public void Index()
{
BlogRepository repository = new BlogRepository();
List<Post> posts = repository.GetAll();
RenderView("Index", posts);
}
[ControllerAction]
public void New()
{
RenderView("New");
}
}
ControllerAction action,ControllerAction :
[AttributeUsage(AttributeTargets.Method)]
public sealed class ControllerActionAttribute : Attribute
{
public ControllerActionAttribute();
}
強力なタイプを使用してViewDataを渡す
前述の例では、コントローラからビューデータをViewに転送する方法の例を示しています.Controllerでは、ビューデータをViewに転送するには、次の例のコードのように、強いタイプを使用してビューデータを転送する方法を2つ選択できます.
[ControllerAction]
public void Index()
{
BlogRepository repository = new BlogRepository();
List<Post> posts = repository.GetAll();
RenderView("Index", posts);
}
複数のModelや集合データをViewに伝えたい場合は、どのように伝えますか?ここでは、もう1つのタイプを定義する必要があります.
public class HomeViewData
{
public List<Post> Posts
{
get; set;
}
public List<Category> Categories
{
get; set;
}
}
次に、コントローラで次のようにデータを転送できます.
[ControllerAction]
public void Index()
{
BlogRepository repository = new BlogRepository();
List<Post> posts = repository.GetAll();
List<Category> categories = repository.GetAllCategory();
HomeViewData viewData = new HomeViewData();
viewData.Posts = posts;
viewData.Categories = categories;
RenderView("Index", viewData);
}
強いタイプのクラスを使用してビューデータを渡すには、次のようなメリットがあります(Scrottguから).
1.文字列を使用してオブジェクトをクエリーしないで、コントローラとビューコードのコンパイル時にチェックする
2.C#のような強い言語でViewDataオブジェクト辞書の値を明確に変換する必要を避ける
3.あなたのビューページの識別ファイルとバックグラウンドコードファイルであなたのViewDataオブジェクトの自動コードintellisenseを得る
4.コード再構築ツールを使用して、アプリケーション全体とユニットテストのコードライブラリの変更を自動化できます.
ViewData辞書を使用してデータを転送
Controllerベースクラスには、次のような辞書定義があります.
public IDictionary<string, object> ViewData { get; }
これにより、ビューデータをViewDataフィールドに直接渡すことができます.次のコードの例を示します.
[ControllerAction]
public void Index()
{
BlogRepository repository = new BlogRepository();
List<Post> posts = repository.GetAll();
List<Category> categories = repository.GetAllCategory();
ViewData["posts"] = posts;
ViewData["categories"] = categories;
RenderView("Index");
}
試行では、次のようにしてビューデータを取得できます.
<div>
<%foreach (Post post in (ViewData["posts"] as List<Post>))
{ %>
<div class="postitem">
<strong>Title</strong>:<%=Html.Encode(post.Title) %></br>
<strong>Author</strong>:<%=Html.Encode(post.Author) %></br>
<strong>PubDate</strong>:<%=Html.Encode(post.PubDate.ToShortDateString()) %></br>
<strong>Content</strong>:<%=Html.Encode(post.Description) %></br>
<%=Html.ActionLink("Edit", new {action="Edit", Id=post.Id })%>
</div><br />
<% } %>
</div>
不明なアクションの処理
Controllerクラスには、HandlerUnknownActionのメソッドが含まれています.
protected internal virtual void HandleUnknownAction(string actionName);
Action, HTTP 404 , , :
[ControllerAction]
protected override void HandleUnknownAction(string actionName)
{
if (ShouldShowSearch(action) == true)
{
RedirectToAction("search", new { query = action });
return;
}
base.HandleUnknownAction(actionName);
}
未知のアクションが発生したときにSearchアクションにジャンプする処理に使用されます.
終わりの言葉
この記事では、ASPについて紹介します.NET MVC FrameworkのControllerには、ControllerおよびActionの定義方法、強いタイプとビューデータ辞書によるビューデータの転送、未知のActionのカスタマイズ処理などが含まれています.最後に、小さな広告を挿入します:私はブログ園のコミュニティの中で1つのWeb技術連盟のグループを創立して、みんなを歓迎して参加します:http://space.cnblogs.com/group/webdev/
作成者:
TerryLee
出典:
http://terrylee.cnblogs.com