ASP.NET MVC Framework体験(4):コントローラ


概要


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