2011年09月29日

TwitterizerをASP.NET MVCで利用してみた

.Netで利用できるtwitter API用のライブラリであるTwitterizerを試してみたのでメモしておきます。 作成したページ:

(ログイン済時)

(未ログイン時)

手順: twitterからConsumer key/secretを取得します。 Twitterizerのライブラリをダウンロードします(今回は2.3.3を利用) 新規で空のMVCプロジェクトを作成します twitterizer2.dllを参照に追加します

こちらが作成したコントローラー

using System.Web.Mvc;

namespace Twitterizer.Controllers
{
    public class TwitterController : Controller
    {
        string ConsumerKey = "コンシューマーキー";
        string ConsumerSecret = "コンシューマーシークレット";

        public ActionResult Index()
        {
            //ログインしていない場合はログインボタンを表示する
            if (Session["AccessToken"] == null)
            {
                return View();
            }
            else
            {
                var statusResponse = ShowTimeline();
                return View(statusResponse);
            }
        }

        [HttpPost]
        public ActionResult Index(FormCollection collection)
        {
            string PostMessage = collection["comment"];

            //tweetを投稿する
            TwitterResponse tweetResponse = TwitterStatus.Update((OAuthTokens)Session["AccessToken"], PostMessage);

            if (tweetResponse.Result != RequestResult.Success)
            {
                @TempData["message"] = "投稿に失敗しました。 : " + tweetResponse.ErrorMessage;
            }

            var statusResponse = ShowTimeline();
            return View(statusResponse);
        }


        public void Login()
        {
            string callbackAddress = "http://localhost:62415/twitter/callback";
            //Requestトークンを取得する
            OAuthTokenResponse authorizationTokens = OAuthUtility.GetRequestToken(ConsumerKey, ConsumerSecret, callbackAddress);
            Response.Redirect(string.Format("http://twitter.com/oauth/authenticate?oauth_token={0}", authorizationTokens.Token), true);
        }

        public ActionResult Callback()
        {
            if (Session["AccessToken"] == null)
            {
                //Accessトークンを取得する
                OAuthTokenResponse tokens = OAuthUtility.GetAccessToken(
                ConsumerKey,
                ConsumerSecret,
                Request.QueryString["oauth_token"],
                Request.QueryString["oauth_verifier"]);

                OAuthTokens accessToken = new OAuthTokens();
                accessToken.AccessToken = tokens.Token;
                accessToken.AccessTokenSecret = tokens.TokenSecret;
                accessToken.ConsumerKey = ConsumerKey;
                accessToken.ConsumerSecret = ConsumerSecret;

                //Accessトークンをセッションに格納する
                Session["AccessToken"] = accessToken;
            }
            return RedirectToAction("Index");
        }

        private TwitterStatusCollection ShowTimeline()
        {
            TimelineOptions options = new TimelineOptions()
            {
                //ホームタイムラインの取得する行を5行に設定する
                Count = 5
            };
            
            //ホームタイムラインを取得する
            TwitterResponse statusResponse = TwitterTimeline.HomeTimeline((OAuthTokens)Session["AccessToken"],options);
            return statusResponse.ResponseObject;
        }
    }
}
こちらが作成したビュー
@model Twitterizer.TwitterStatusCollection
@{
    ViewBag.Title = "Index";
}

@if (Session["AccessToken"] == null)
{
    using (Html.BeginForm("Login", "Twitter"))
    { 
    
    }
}
else
{
    
@foreach (var s in Model) {
@s.User.ScreenName
@s.User.ScreenName @s.Text
}
@using (Html.BeginForm("Index", "Twitter")) {
}
@if (TempData["message"] != null) { @TempData["message"] }
}
以上です。
posted by まーつん at 01:29| Comment(4) | TrackBack(0) | ASP.NET MVC | このブログの読者になる | 更新情報をチェックする

2011年04月21日

ASP.NET MVC 3とEntity Framework – Cascade Delete(カスケードデリート)

前回作ったアプリケーションではメモを削除しようとすると、コメントがある場合にエラーとなっていたので、メモの削除と同時に関連するコメントも削除するように変更したいと思います。 方法は簡単でCommentクラスに以下の二行を追加をします。
[Required]
public virtual Entry Entry { get; set; }

こうすることでCommentsテーブルからEntryiesテーブルへのリレーションがCascade Deleteの設定となり、親のメモを削除すると自動でコメントも削除するようになります。 image

posted by まーつん at 00:46| Comment(0) | TrackBack(0) | ASP.NET MVC | このブログの読者になる | 更新情報をチェックする

2011年04月11日

ASP.NET MVC 3とEntity Frameworkを使ったコードファースト開発に挑戦 (その3)

コントローラーの作成

コントローラーを作成します。ソリューション エクスプローラから Controllersフォルダを右クリックし、「追加」>「コントローラー」をクリックします。 image_thumb18_thumb
using System;
using System.Web.Mvc;
using MvcEFApp.Models;

namespace MvcEFApp.Controllers
{
    public class EntryController : Controller
    {
        public EntryController()
            : this(new EntryRepository())
        {
        }

        public EntryController(IEntryRepository entryRepository)
        {
            _entryRepository = entryRepository;
        }

        private readonly IEntryRepository _entryRepository;

        //
        // GET: /Entry/

        public ActionResult Index()
        {
            var entry = _entryRepository.GetAll();
            return View(entry);
        }

        //
        // GET: /Entry/Details/5

        public ActionResult Details(int id)
        {
            var entry = _entryRepository.Find(id);
            return View(entry);
        }

        //
        // GET: /Entry/Create

        public ActionResult Create()
        {
            return View();
        }

        //
        // POST: /Entry/Create

        [HttpPost]
        public ActionResult Create(Entry entry)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return View(entry);
                }

                entry.CreatedAt = DateTime.Now;
                _entryRepository.Add(entry);
                _entryRepository.Save();

                return RedirectToAction("Index");
            }
            catch
            {
                return View(entry);
            }
        }

        //
        // GET: /Entry/Edit/5

        public ActionResult Edit(int id)
        {
            var entry = _entryRepository.Find(id);
            return View(entry);
        }

        //
        // POST: /Entry/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            var entry = _entryRepository.Find(id);

            try
            {
                UpdateModel(entry);

                _entryRepository.Save();

                return RedirectToAction("Index");
            }
            catch
            {
                return View(entry);
            }
        }

        //
        // GET: /Entry/Delete/5

        public ActionResult Delete(int id)
        {
            var entry = _entryRepository.Find(id);
            return View(entry);
        }

        //
        // POST: /Entry/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            var entry = _entryRepository.Find(id);

            try
            {
                _entryRepository.Remove(entry);
                _entryRepository.Save();

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
}
リポジトリパターンを利用しているため、最初にIEntryRepositoryインターフェイスを宣言し、パラメタなしのコンストラクタが呼ばれた時、自身のオブジェクトをEntryRepositoryクラスのパラメタ付きで再生成しています。パラメタ付きのコンストラクタで、EntryRepositoryクラスをIEntryRepositoryインターフェイスに代入して利用します。

ビューの作成

ビューを作成します。ソリューション エクスプローラから Viewsフォルダ内のEntryフォルダを右クリックし、「追加」>「表示」をクリックしそれぞれのアクションに対応したビュー作成します。

image_thumb22_thumb どのビューでも、モデルクラスにEntry (MvcEFApp.Models)を選びます。

ルーティングの設定

アプリケーションのルーティングを設定します。 今回はデフォルトでEntryコントローラーのIndexアクションをコールするように設定します。 Global.asaxのRegisterRoutesメソッド内を以下の用に変更します。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // ルート名
        "{controller}/{action}/{id}", // パラメーター付きの URL
        new { controller = "Entry", action = "Index", id = UrlParameter.Optional } // パラメーターの既定値
    );

}
F5キーを押してアプリケーションを起動してみます。 ここまででEntryに関しては表示とCRUDができるようになりました。

コメントの実装

コメントを入力できるようにコントローラーと、メモの詳細ページでコメントを入力できるように部分ビューを作成します。 image_thumb24_thumb

namespace MvcEFApp.Controllers
{
    public class CommentController : Controller
    {
        private readonly IEntryRepository _entryRepository;

        public CommentController()
            : this(new EntryRepository())
        {
        }

        public CommentController(IEntryRepository entryRepository)
        {
            _entryRepository = entryRepository;
        }

        //
        // GET: /Comment/Create
        [ChildActionOnly]
        public ActionResult Create()
        {
            return PartialView();
        } 

        //
        // POST: /Comment/Create

        [HttpPost]
        public ActionResult Create(int id, Comment comment)
        {
            try
            {
                var entry = _entryRepository.Find(id);

                comment.CreatedAt = DateTime.Now;

                entry.Comments.Add(comment);

                _entryRepository.Save();

                return RedirectToAction("Details", "Entry", new { id = id });
            }
            catch
            {
                return RedirectToAction("Details", "Entry", new { id = id });
            }
        }
        
    }
}

GETで呼ばれるCreateアクションにChildActionOnly属性を付けています。これによりURL指定でアクセスされた時にビューを返さなくなります。 またreturnに利用するメソッドをPartialViewメソッドに変更しています。

Postで呼ばれるCreateアクションにはidパラメータを追加しました。このidで対象のメモを取得してCommentsに追加しています。

コメントはCreateアクションだけを実装するので、その他のアクションを削除しています。

コメント登録用に部分ビューを作成します。image_thumb26_thumb 「部分ビューとして作成する」にチェックを入れます。

@using (Html.BeginForm("Create","Comment")) {
    @Html.ValidationSummary(true)
     Comment 
@Html.LabelFor(model => model.NickName)
@Html.EditorFor(model => model.NickName) @Html.ValidationMessageFor(model => model.NickName)
@Html.LabelFor(model => model.Body)
@Html.EditorFor(model => model.Body) @Html.ValidationMessageFor(model => model.Body)
  }
部分ビューからのサブミットになるため、Html.BeginForm()をHtml.BeginForm("Create","Comment")に変更します。 Detailsビューにコメントを表示します。
@model MvcEFApp.Models.Entry

@{
    ViewBag.Title = "Details";
}

Details

Entry
Title
@Model.Title
Body
@*改行するように変更*@
@Html.Raw(Model.Body.Replace("\n", "<br/>"))
CreatedAt
@String.Format("{0:g}", Model.CreatedAt)
@*コメントを表示する*@

コメント

@foreach (var comment in Model.Comments) {
@comment.NickName (@comment.CreatedAt.ToString("g"))
@Html.Raw(@comment.Body.Replace("\n", " "))
}
@Html.Action("Create", "Comment")

@Html.ActionLink("Edit", "Edit", new { id=Model.EntryId }) | @Html.ActionLink("Back to List", "Index")

Html.Actionメソッドを利用し、コメント入力の表示を追加します。 @Html.Action("Create", "Comment")

ここまでで、メモにコメントの表示と入力ができるようになり、アプリケーションが完成しました。

自動生成されたテーブルの確認

最後にサーバーエクスプローラーからテーブルを見てみましょう。 Entriesテーブル image_thumb33_thumb Commentsテーブル image_thumb31_thumb 期待した通り、プライマリーキー、文字列の長さ、CommentsテーブルにEntriesテーブルへのリレーションなどが自動でできていることがわかります。

ラベル:ASP.NET MVC
posted by まーつん at 00:53| Comment(1) | TrackBack(0) | ASP.NET MVC | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。