ASP.NET MVC でパラメータを渡す方法

 

Global.asax.cs でパラメータを3つ設定

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

    routes.MapRoute(
        “Default”, // ルート名
        “{controller}/{action}/{p1}/{p2}/{p3}”, // パラメーター付きの URL
        new { controller = “Home”, action = “Index”,
              P1 = UrlParameter.Optional,
              P2 = UrlParameter.Optional,
              P3 = UrlParameter.Optional
        } // パラメーターの既定値
    );

}

HomeController.cs で、パラメータをViewData にセット。このとき、UrlParameter.Optional としているので、int, float はそれぞれ nullable にしておかないとエラーになる。

public ActionResult Index(string p1, int? p2, float? p3)
{
    ViewBag.Message = “ASP.NET MVC へようこそ”;
    ViewData[“p1”] = p1;
    ViewData[“p2”] = p2;
    ViewData[“p3”] = p3;
    return View();
}

index.cshtmlで、

    <p>p1 = @ViewData[“p1”]</p>
    <p>p2 = @ViewData[“p2”]</p>
    <p>p3 = @ViewData[“p3”]</p>

とする。

次のULRでの文字列、int, float も正しい型で処理されている。

http://…/Home/Index/文字列/123/3.1419e-3

image

ASP.NET MVC ActionResultの派生型

http://msdn.microsoft.com/ja-jp/magazine/dd695917.aspx

「ASP.NET MVC Controller の動作」より、ActionResult のディライブドクラスを抜き出したもの。

名前 フレームワークの動作 生成メソッド
ContentResult 文字列値を HTTP 応答に直接書き込みます。 Content
EmptyResult HTTP 応答に書き込みません。  
FileContentResult ファイルの内容 (バイトの配列として表される) を取得し、HTTP 応答に書き込みます。 File
FilePathResult 指定した場所にあるファイルの内容を取得し、HTTP 応答に書き込みます。 File
FileStreamResult コントローラによって生成されたファイル ストリームを取得し、HTTP 応答に書き込みます。 File
HttpUnauthorizedResult 承認チェックが失敗したときに承認フィルタによって使用される特殊な= 結果です。  
JavaScriptResult クライアントが実行するスクリプトをクライアントに返します。 JavaScript
JsonResult JavaScript Object Notation (JSON) のデータをクライアントに返します。 Json
RedirectResult クライアントを新しい URL にリダイレクトします。 Redirect
RedirectToRouteResult 指定されたビューをレンダリングして HTML フラグメントを返します (通常は AJAX のシナリオで使用されます)。 RedirectToRoute / RedirectToAction
PartialViewResult 指定されたビューをレンダリングして HTML フラグメントを返します (通常は AJAX のシナリオで使用されます)。 PartialView
ViewResult 指定されたビューをレンダリングして HTML をクライアントに返します。 View

ASP.NET MVC 3 JPN

PI3 の説明ページより引用

「Microsoft Web Platform Installer 3.0 (Web PI) は Internet Information Services (IIS)、 SQL Server Express、 .NET Framework そして Visual Web Developer といったマイクロソフトの Web プラットフォームにおける最新のコンポーネントを簡単に入手するための無償のツールです。加えて、 Web PI では Windows Web アプリケーション ギャラリーに登録されている CMS やブログを構築するための無償の Web アプリケーションを簡単にインストールすることが可能です。」

ということで、PI3.0 を使って、ASP.NET MVC 3 を入れてみる。

image

ASP.NET MVC 3(英語) を選択し、追加

image

ライセンスの確認画面で同意する

image

ASP.NET MVC 3のインストール開始

image

インストールされたコンポーネント群。

image

そういえば、これは英語版なので、日本語パッケージがない。

そこで、MSDN から、AspNetMVC3Setup_JPN.exe をダウンロードしてくる。

http://www.microsoft.com/downloads/details.aspx?FamilyID=d2928bc1-f48c-4e95-a064-2a455a22c8f6&displayLang=ja

image

そして、最終的にこれだけのコンポーネントがインストールされる。

image

このあたりのことは、
ASP.NET MVC 3 日本語版公開と、いくつかの改善点について …

http://blogs.msdn.com/b/chack/archive/2011/01/22/asp-net-mvc-3-japanese-package-and-some-issue-on-localized-package.aspx

に詳しく書かれている。

ローカライズの笑えぬ翻訳~「View」 を「表示」 ってのも、結構涙目。

MVC 3 入れる前のプロジェクトテンプレート

MVC 3 を入れる前のプロジェクトテンプレートを記念?にスクリーンショット

image

さて、MVC 3を入れるとどうなるか・・・

単に MVC 3 が増えただけだったw

image

しかし、MVC 3を選ぶと、Razor ビュー エンジンがもれなくついてくる。

image

Razor で、ようやくMVCを使う気になってきた。

ASP.NET MVC で LINQ to XML

環境; Windows 7 x64 Ultimate, Visual Studio 2010 Ultimate, .Net Framework 4.0, MVC 2

http://dailynews.yahoo.co.jp/fc/rss.xml

にあるRSSデータをLINQで読み込み、MVC2で表示させる。

RSSデータは、次のような感じ。

http://backend.userland.com/blogChannelModule”>
<channel>   
<title>Yahoo!ニュース・トピックス – トップ</title>
<link>
http://dailynews.yahoo.co.jp/fc/</link>
<description>Yahoo! JAPANのニュース・トピックスで取り上げている最新の見出しを提供しています。</description>
<language>ja</language>
<pubDate>Sun, 30 Jan 2011 13:43:46 +0900</pubDate>

<item>
<title>民主党綱領めぐり主導権争い</title>
<link>
http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/politics/</link>
<pubDate>Sat, 29 Jan 2011 13:37:45 +0900</pubDate>
<guid isPermaLink=”false”>yahoo/news/topics/3494716</guid>
</item>

<item>
<title>邦人500人が足止め エジプト</title>
<link>
http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/world/overseas_japanese/</link>
<pubDate>Sun, 30 Jan 2011 11:39:52 +0900</pubDate>
<guid isPermaLink=”false”>yahoo/news/topics/3501016</guid>
</item>

———————————–

1. MVC2 の新規プロジェクト作成

2. ソリューションエクスプローラーから、Contoller を右クリックし、コントローラの追加を選択

image

3. YahooRssController を追加

image

4. YahooRssController.cs に次のコードを実装

using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using System.Xml.Linq;
using System.Linq;

namespace MvcApplication3.Controllers
{
    public class YahooRssController : Controller
    {
        //
        // GET: /YahooRss/

        public ActionResult Index()
        {
            var res = new List<YahooRss>();

            ViewData[“Message”] = “ASP.NET MVC へようこそ”;

            string yahooRssUrl = “http://dailynews.yahoo.co.jp/fc/rss.xml”;
            XDocument rss = XDocument.Load(yahooRssUrl);

            res = (from item in rss.Descendants(“item”)
                   select new YahooRss
                   {
                       title = (item.Element(“title”).Value ?? “”),
                       link = item.Element(“link”).Value,
                       pubDate = item.Element(“pubDate”).Value,
                       guid = item.Element(“guid”).Value
                   }).ToList();

            return View(res);
        }

        public class YahooRss
        {
            public string title { get; set; }
            public string link { get; set; }
            public string pubDate { get; set; }
            public string guid { get; set; }
        }
    }
}

6.  ビューを追加

コードエディタの public ActionResult Index() のスコープ内を右クリックして、ビューの追加を選択

image

すると、次のようなビューの追加ダイアログが表示されるので、そのまま Index というビューを追加する。

image

7.  ビューの実装

<ul></ul>ブロック内を実装する。

<%@ Page Language=”C#” Inherits=”System.Web.Mvc.ViewPage<dynamic>” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
    <title>Index</title>
</head>
<body>
    <div>
             <ul>
          <% foreach (var res in Model)
             {  %>
               <li> <a href=<%=Html.Encode(res.link) %>><%=Html.Encode(res.title) %></a> </li>
          <% } %>
     </ul>
    </div>
</body>
</html>

8. 実行すると・・・

http://localhost:1852/YahooRss/Index というURLに対して、次のようになる。1852 は実行環境によって違います。

image

ポイントは、View で表示する際に、

var res = from item in rss.Descendants(“item”)
select new
{
   …
}

という形だと、View 側で、Model の型がわからず、実行時エラーになってしまう。

そこで、Contoller で、public class YahooRss というクラスで明示的に定義して、

var res = new List<YahooRss>();
res = (from item in rss.Descendants(“item”)
                   select new YahooRss
                   {
                       title = (item.Element(“title”).Value ?? “”),
                       link = item.Element(“link”).Value,
                       pubDate = item.Element(“pubDate”).Value,
                       guid = item.Element(“guid”).Value
                   }).ToList();

というように、データを渡してあげること。

このことに関しては、次のURLを参考にしました。

Using ASP.NET MVC 2 to Query Twitter’s Public API – FIFA 2010

http://www.dotnetcurry.com/ShowArticle.aspx?ID=536&AspxAutoDetectCookieSupport=1

Windows Live Mesh 2011 のインストールはここから

まちがって、USのサイトからインストールしてしまうと、英語バージョンの Writer とかがインストールされてしまうので、次の日本語のサイトからインストールする。

image

http://explore.live.com/windows-live-mesh?os=other

インストール開始時に、次のようにインストールするプログラムの選択ダイアログが表示されるが、2つ目のインストールする製品の選択より、必要なものだけをインストールするのがおすすめ。

image

それでないと、ファミリーセーフティなど、デフォルトですべてのLive プログラムがインストールされてしまう。

image

Live Mesh は、複数のPCでデスクトップ、お気に入り、マイドキュメントを同期できるので、複数のPCで作業をしている人にはおすすめ。それから、WordPress を使用するなら、Writerがおすすめですね。

vmware の Virtual Machine がファイルをロックできずに起動できない場合の対処方法

停電でPCが落ちたら、vmware の Virtual Machine が起動できなくなってしまいました。エラーメッセージは次の通り。

ディスク「****.vmdk」、またはこのディスクが依存するスナップショット ディスクを開くことができません。

理由: ファイルをロックできませんでした。

image

対処方法

上記仮想ディスクのフォルダーにある、***.vmdk.lck ファイルがあるので、このロックファイルを削除する。その前に無停電電源装置UPSをつけなさいということですね。

わかってはいますが・・・

SQL テーブルの IDENTITY をリセットする方法

テーブルのIDに IDENTITY をセットしている時に、テーブルの中身を消して、もう一度ID を0からふりなおしたい場合

image

TRUNCATE TABLE テーブル名

DBCC CHECKIDENT (テーブル名, RESEED , 0)

GO

補足

WHERE 句を伴わない DELETE FROM であれば、TRUNCATE TABLE  テーブル名 の方が高速で、使用するシステム リソースとトランザクション ログ リソースも少なく、おすすめ。

Outlook 2010 より SQL へ直接 INSERT

Outlook 2010 から EXCELや、CSV への出力は、ファイルへのエクスポートで簡単にできるが、直接SQLに入れたい場合。

[Outlook のオプション]で、[開発]タブは規定値でオフになっているので、ここにチェックを入れる。

image

すると[開発]タブが表示される。

image

[マクロ]ボタンを押し、[マクロ]ダイアログより、たとえばOutlookToSqlマクロを作成する。

image

すると、Visual Basic のエディタが開く。[ツール]→[参照設定]を選択する。

image

[参照設定]より、”Microsoft ActiveX Data Objects 6.0 Library”を選択する。バージョンは環境によって異なるので最新のもので試してみればよいと思う。

image

SQL Server では、たとえばこんなテーブルを作っておく。

image

そして、次のマクロを実行する。

Sub OutlookToSql()
    Dim myOlapp As New Outlook.Application
   
    Dim myNameSpace As Outlook.NameSpace
    Dim myFolder As Outlook.Folder
   
    Dim 送信日時 As Date
    Dim 受信日時 As Date
    Dim 件名 As String
    Dim 内容 As String
   
    Set myNameSpace = myOlapp.GetNamespace(“MAPI”)
    Set myFolder = myNameSpace.Folders.Item(“Outlook”).Folders(“受信トレイ”)
   
    Dim adoCon As New ADODB.Connection
   
    adoCon.Open “Driver={SQL Server};” & _
      “server=192.168.11.9; database=test;Trusted_Connection=yes”
       
    Dim cmd As String
   
    With myFolder
        For i = 1 To .Items.Count
            件名 = .Items(i).Subject
            件名 = Replace(件名, “‘”, “””)
           
            送信日時 = .Items(i).SentOn
            受信日時 = .Items(i).ReceivedTime
            内容 = .Items(i).Body
            内容 = Replace(内容, “‘”, “””)
           
            cmd = “insert into Mail(Subject, SentOn, Received, Body) values (” & _
                “‘” & 件名 & “‘,” & _
                “‘” & 送信日時 & “‘,” & _
                “‘” & 受信日時 & “‘,” & _
                “‘” & 内容 & “‘” & _
                “)”
            adoCon.Execute cmd
        Next i
    End With
   
    adoCon.Close
   
    MsgBox “Done”
   
End Sub

結果はこんな感じ。

image

VBA でSQLのコマンドを文字列で生成しているので、SQL Injection 対策が必要なので注意。