<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4080260435552833277</atom:id><lastBuildDate>Mon, 07 Oct 2024 04:56:24 +0000</lastBuildDate><category>雑記</category><category>MVC</category><category>ASP.Net</category><category>C#</category><category>Access</category><category>VBA</category><category>LINQ</category><category>SQLServer</category><category>jquery</category><category>WindowsServer</category><category>html</category><category>予定</category><title>Lightstaffの適当なメモ帳</title><description></description><link>http://lightstaffblog.blogspot.com/</link><managingEditor>noreply@blogger.com (LightstaffBlog)</managingEditor><generator>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-4138873356859358190</guid><pubDate>Sat, 08 Dec 2012 02:26:00 +0000</pubDate><atom:updated>2012-12-08T11:26:45.359+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">jquery</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.NET】テンプレートを使ってカレンダー付きテキストボックスを作ってみる【MVC】</title><description>　超絶久しぶりな更新ですが、あっさりめに済ませます。いきなりですが、通常通り作った場合のサンプルを表示します。今回はコントローラーでは何もしないので省略です。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Pepoleモデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class People
{
    public string Name { get; set; }

    public DateTime Birthday { get; set; }
 
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Createビュー&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: html&quot;&gt;@model MvcApplicationTest3.Models.People
 
@{
    ViewBag.Title = &quot;Create&quot;;
    Layout = &quot;~/Views/Shared/_Layout.cshtml&quot;;
}
 
&amp;lt;h2&amp;gt;Create&amp;lt;/h2&amp;gt;
 
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
 
    &amp;lt;fieldset&amp;gt;
        &amp;lt;legend&amp;gt;People&amp;lt;/legend&amp;gt;
 
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            @Html.LabelFor(model =&amp;gt; model.Name)
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
            @Html.EditorFor(model =&amp;gt; model.Name)
            @Html.ValidationMessageFor(model =&amp;gt; model.Name)
        &amp;lt;/div&amp;gt;
 
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            @Html.LabelFor(model =&amp;gt; model.Birthday)
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
            @Html.EditorFor(model =&amp;gt; model.Birthday)
            @Html.ValidationMessageFor(model =&amp;gt; model.Birthday)
        &amp;lt;/div&amp;gt;
 
        &amp;lt;p&amp;gt;
            &amp;lt;input type=&quot;submit&quot; value=&quot;Create&quot; /&amp;gt;
        &amp;lt;/p&amp;gt;
    &amp;lt;/fieldset&amp;gt;
}
 
&amp;lt;div&amp;gt;
    @Html.ActionLink(&quot;Back to List&quot;, &quot;Index&quot;)
&amp;lt;/div&amp;gt;
 
@section Scripts {
    @Scripts.Render(&quot;~/bundles/jqueryval&quot;)
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjyrA7nMVk56qnWUOLWX4WU9qYJxURLWd0FKp8ZRTJ7rzNxJnScDyC1HFIBaHUJAEwwl6k89xRa3DA6BqtKdEd94GyrkNGDuGKSLW1LGrvNb7366vVKizv-2yaaiZw7cUFkwaALLOhMT4/s1600-h/image%25255B16%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;376&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjln4cq3a_a6W2u3MAu_iobc0iA18miDOiJSx6A4al33mzCOJ3PrS-CP8H-3DpfG0qyB787j8G99ij_k41-4iSO284f67eRE0IZze5uOVV0X3EEBOjwXJ9o7VUj0NmehS0QWTPbWtKzQ3k/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 当然ながらBirthdayにカーソルがあたっても何も起きません。こういう時、大抵はカレンダーが表示された方が便利がいいですよねって話です。んでMVCの場合、jqueryUIが使えるんだからUIのDatePickerを使ってみようってなるんですが、日付型が出てくるたびにいちいち定義してたら面倒ですよね？ってことでテンプレートの出番になるわけです。&lt;br /&gt;
&lt;br /&gt;
　早速、ヘルパーテンプレートを作成します。テンプレートはある程度決まったルール（フォルダ名）で配置することで、自動で検索されて自動で定義されます（明示的に定義することも可能です）。何言ってんだって感じですが、まぁやってみれば分かります。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;フォルダーとテンプレートファイルの追加&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJbfVMgMXL5eajhjj0FeCkJpdkmAgKXBntcX0NdY4D284T2C_PotGvGIQefjdOdq1EEzL6jG9G74MxVXjyWmgI5zIN6NpngJOelsQMmT20mWMfp49yugvjtGP6df35mCZyiJ7q9Lu0OMU/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;199&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj317SPO7vTArfzij1TP6Tjw1ThoWNs5VmjlAxJGvlmBM5SFRMWiO2TYTrrfX42tQpnyocVQDlJgNFWK-SuS9xXtSgcbCHEes8ZM6kWv_52PPm6z1pkElykJLqHUEFrv2sejHcdbsy7G1Y/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　このようにテンプレートファイルは利用するヘルパー系統フォルダー（EditorTemplates）の下にデータ型の名前で定義します（DateTime.cshtml）。今回はEditor系のテンプレートなのでEditorTemplatesというフォルダ名になっていますが、Display系のテンプレートであればDisplayTemplatesとなります。これで構築される際にEditorヘルパーでDateTime型だった場合、このテンプレートが呼び出されます。また、今回はShared配下に置いていますが、利用がそのビューに限定される場合はそのビューの配下に置くことも可能です。&lt;br /&gt;
&lt;br /&gt;
　次はテンプレートの中身です。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;テンプレートファイル（DateTime.cshtml）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: html&quot;&gt;@model System.DateTime?
 
@Html.TextBoxFor(model=&amp;gt;model, new { @class=&quot;datepicker&quot;})
 
&amp;lt;!-- DatePicker定義 --&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    $(function () {
        $(&#39;.datepicker&#39;).datepicker();
    });
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　シンプルなので特に解説することもないのですが、jqueryUIの定義は他でしたほうが良さそうなのでレイアウトなり、ビューなりでやっちゃってください。ちなみにモデルはnull対策のためnull許容型にしています。&lt;br /&gt;
&lt;br /&gt;
　次にテンプレートを呼び出すためにモデルのデータ型を属性で明示してやります。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Peopleモデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class People
{
    public string Name { get; set; }

    [DataType(DataType.DateTime)] //←これを追加
    public DateTime Birthday { get; set; }
 
}&lt;/pre&gt;
&lt;br /&gt;
　これで完了です。ビュー側は自動的にテンプレートが呼び出されるので変更する必要はありません。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjngxla5RSHcr44sQ9nIk9u8aL_roXK7iIMOf4jSutv23YJqUiCrX_dAwpNpiPm9n8ucZL7CWXMvKEGV8nrxIVT3hQA9ptMTRe7jE2S7PSKB3d5p2pnC4v2eo5SLqQEle67vvQ39cFrKi0/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;515&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1bKfQpbONi-PBZuJOSE_gOfMrFGx8ku8XqMIvtWTohoVVsO1VmAdP8bcVqP9kO_TYQvA5cTHq8E0cZqI7lB0GUhQ6RRmRX_-BzRwSwKr9jb_oNnZAZ57ivp4NgCASOjZW7Pyez5XthmQ/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　こんな具合で望んだ通りになりました。Shared配下にテンプレートを作成したのでこれ以外のビューでもモデルにDateTime型が明示してあればビューは自動でこのテンプレートを割り当てます。&lt;br /&gt;
&lt;br /&gt;
　以上、久しぶりに更新すると余計に日本語が怪しくなってる気がする…。</description><link>http://lightstaffblog.blogspot.com/2012/12/aspnetmvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjln4cq3a_a6W2u3MAu_iobc0iA18miDOiJSx6A4al33mzCOJ3PrS-CP8H-3DpfG0qyB787j8G99ij_k41-4iSO284f67eRE0IZze5uOVV0X3EEBOjwXJ9o7VUj0NmehS0QWTPbWtKzQ3k/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-5634248758799098168</guid><pubDate>Thu, 22 Nov 2012 06:17:00 +0000</pubDate><atom:updated>2012-11-22T15:17:21.097+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>【EF CodeFirst】リレーションの連鎖削除について</title><description>　何かすごく久しぶりの更新なのに大した話ではないんですが、メモついでに…。&lt;br /&gt;
&lt;br /&gt;
　コードファーストでリレーションを組んだ場合の連鎖削除についてです。&lt;br /&gt;
　まぁ、以下のようなCategoryとSubCategoryと名付けた親子のテーブルがあるとします。&lt;br /&gt;
&lt;br /&gt;
Categoryテーブル&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class Category
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection&amp;lt;subcategory&amp;gt; SubCategories { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
SubCategoryテーブル&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class SubCategory
{
    public int Id { get; set; }

    public int ClassId { get; set; }

    public string Name { get; set; }

    public virtual Category Category { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
　見ての通り、ClassIdを外部キーとしてリレーションするわけですが、Categoryのデータを削除した場合、SubCategoryのデータはどうなるのでしょうか？答えは連鎖削除されちゃいます。まったくEntityFrameworkって気が利いてますねって感じです。&lt;br /&gt;
&lt;br /&gt;
　では逆に連鎖削除してほしくない時はどうすればよいのでしょうか？自分、他のテーブルとの関係で連鎖削除OFFにしたくてずいぶん悩みました。答えは以下のようにテーブルを変更します。&lt;br /&gt;
&lt;br /&gt;
Categoryテーブル&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class Category
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection&amp;lt;subcategory&amp;gt; SubCategories { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
SubCategoryテーブル&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class SubCategory
{
    public int Id { get; set; }

    public int? ClassId { get; set; }

    public string Name { get; set; }

    public virtual Category Category { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
　ちょっとどこが変わったか分かりにくいですが、SubCategoryのClassIdの型をNull許容型に変更しています。こうすることでリレーションを保ったまま連鎖削除を切ることができます。&lt;br /&gt;
&lt;br /&gt;
　ちなみにこれらの設定はMigrationのForeignKeyをいじることでも行うことができます。</description><link>http://lightstaffblog.blogspot.com/2012/11/ef-codefirst.html</link><author>noreply@blogger.com (LightstaffBlog)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-1694069780042586686</guid><pubDate>Mon, 12 Nov 2012 01:21:00 +0000</pubDate><atom:updated>2012-11-12T10:21:21.732+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">雑記</category><title>【雑記】絶賛放置中</title><description>いやぁ、まじめに仕事するってすばらしい…（涙）&lt;br /&gt;
&lt;br /&gt;
って感じでメモすることもなくブログを絶賛放置中です。&lt;br /&gt;
&lt;br /&gt;
どうでもよいことですMacTypeなるフリーのフォントレンダリングソフトを入れてみました。&lt;br /&gt;
&lt;br /&gt;
何かと競合しちゃったりしたら怖いけどとりあえずフォントが綺麗になったのには感動しました。&lt;br /&gt;
&lt;br /&gt;
…ただそれだけです。まじめに働いてねーじゃねーかという気もしますが、これからまじめモードに…。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
レンダーが効いてる図&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTZzqZF_MObMcVUgq5Lv46Sd7iK0m4-WfLgX_xAYN4MF7O2hxVKWh9eG484fSpSR_u9F9_6HoJMbwjqAfUhiqYOW136ZcZxeS3o2Cp5VmN4lslr1fQ8QZYalp6Uedp-zp3QQb2BRevd5s/s1600/20121112.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;160&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTZzqZF_MObMcVUgq5Lv46Sd7iK0m4-WfLgX_xAYN4MF7O2hxVKWh9eG484fSpSR_u9F9_6HoJMbwjqAfUhiqYOW136ZcZxeS3o2Cp5VmN4lslr1fQ8QZYalp6Uedp-zp3QQb2BRevd5s/s640/20121112.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://lightstaffblog.blogspot.com/2012/11/blog-post.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTZzqZF_MObMcVUgq5Lv46Sd7iK0m4-WfLgX_xAYN4MF7O2hxVKWh9eG484fSpSR_u9F9_6HoJMbwjqAfUhiqYOW136ZcZxeS3o2Cp5VmN4lslr1fQ8QZYalp6Uedp-zp3QQb2BRevd5s/s72-c/20121112.png" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-5398390777152612576</guid><pubDate>Fri, 26 Oct 2012 09:20:00 +0000</pubDate><atom:updated>2012-10-26T18:20:40.002+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">雑記</category><title>【雑記】本日の箇条書き</title><description>&lt;ul&gt;
&lt;li style=&quot;line-height: 1.6; margin: 10px;&quot;&gt;相変わらずまじめに開発入っちゃってるからこれまた相変わらずネタがない。&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6; margin: 10px;&quot;&gt;jQueryが楽しいせいで本体が疎かに…。デザインは楽しいけど終わりないのが問題。やっぱりこーゆーのは分業したい。そして自分はデザイン側に…（飽きたら逆のことを言い出す気もするけど）。&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6; margin: 10px;&quot;&gt;でもプラグインはどこまで使うは悩む。頼りきると将来的に痛い目を見る気がする。かといってあるものをいちいち書くのか？って気もしてる。&lt;/li&gt;
&lt;li style=&quot;line-height: 1.6; margin: 10px;&quot;&gt;とりあえず逆説的だけどシンプルなものは取り入れて、複雑なものは敬遠、どうしても必要なら書く方向で…。&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/10/blog-post_26.html</link><author>noreply@blogger.com (LightstaffBlog)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-5260896336470821432</guid><pubDate>Thu, 18 Oct 2012 09:14:00 +0000</pubDate><atom:updated>2012-10-18T18:14:05.512+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】部分ビューの更新【MVC】</title><description>　久しぶりの更新です。&lt;br /&gt;
&lt;br /&gt;
　唐突ですが、カテゴリーの配下にサブカテゴリーがある場合、入力時なんかはカテゴリーが選択された後はサブカテゴリーはそのカテゴリーの配下のものに絞られた方が便利ですよね。Winフォームとかだったらカテゴリー決定後にイベント発生させてってできるわけなんですがWebになるとどうすりゃいいいのって話になるわけです。&lt;br /&gt;
　というわけでとりあえずモデルを提示しときます。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;カテゴリーモデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class Category
{
    public int Id { get; set; }
 
    public string Name { get; set; }
 
    public virtual List&amp;lt;SubCategory&amp;gt; SubCategories { get; set; }
 
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;サブカテゴリーモデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class SubCategory
{
 
    public int Id { get; set; }
 
    public int CategoryId { get; set; }
 
    public string Name { get; set; }
    
    public virtual Category Category { get; set; }
 
    public virtual List&amp;lt;Article&amp;gt; Articles { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;商品モデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class Article
{
 
    public int Id { get; set; }
 
    public string Name { get; set; }
 
    public int SubCategoryId { get; set; }
 
    public virtual SubCategory SubCategory { get; set; }
 
}&lt;/pre&gt;
&lt;br /&gt;
　イメージとしては商品入力時、カテゴリードロップダウンリストを決定したら、サブカテゴリードロップダウンリストの部分のみを更新って感じでしょうか。1部分のみの更新といえば部分ビューの出番ですね。&lt;br /&gt;
&lt;br /&gt;
　さっさと結果から言っちゃうとできたことはできたんですが、カテゴリーをAJAXヘルパーを使うため商品モデルの拡張とビュー側でドロップダウンリストが使えないという問題が…。以下、サンプルコードです。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;商品モデル拡張&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class ArticleEdit
{
    public Article Article { get; set; }
 
    public List&amp;lt;Category&amp;gt; Categories { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;コントローラー（一部抜粋）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Create()
{
    var model = new ArticleEdit
    {
        Categories = db.Categories.ToList()
    };
 
    ViewBag.SubCategoryId = new SelectList(db.SubCategories, &quot;Id&quot;, &quot;Name&quot;);
    return View(model);
}
 
[HttpPost]
public ActionResult Create(ArticleEdit model)
{
    if (ModelState.IsValid)
    {
        db.Articles.Add(model.Article);
        db.SaveChanges();
        return RedirectToAction(&quot;Index&quot;);
    }
 
    ViewBag.SubCategoryId = new SelectList(db.SubCategories, &quot;Id&quot;, &quot;Name&quot;, model.Article.SubCategoryId);
    return View(model);
}

//これが部分ビューのアクション 
public ActionResult SubCategoryDropDownList(int categoryId = 1)
{
    ViewBag.SubCategoryId = new SelectList(db.SubCategories.Where(p =&amp;gt; p.CategoryId == categoryId), &quot;Id&quot;, &quot;Name&quot;);
    return View();
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Createビュー（フォーム部分のみ）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
 
    &amp;lt;fieldset&amp;gt;
        &amp;lt;legend&amp;gt;Article&amp;lt;/legend&amp;gt;
 
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            @Html.LabelFor(model =&amp;gt; model.Article.Name)
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
            @Html.EditorFor(model =&amp;gt; model.Article.Name)
            @Html.ValidationMessageFor(model =&amp;gt; model.Article.Name)
        &amp;lt;/div&amp;gt;
 
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            カテゴリー
        &amp;lt;/div&amp;gt;
        
        &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
            &amp;lt;ul&amp;gt;
                @foreach (var category in Model.Categories)
                {
                    &amp;lt;li&amp;gt;
                        @Ajax.ActionLink(category.Name, &quot;SubCategoryDropDownList&quot;, new { categoryId = category.Id}, new AjaxOptions{UpdateTargetId=&quot;subcategoryarea&quot;})
                    &amp;lt;/li&amp;gt;
                }
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            サブカテゴリー
        &amp;lt;/div&amp;gt;
        
        &amp;lt;div id=&quot;subcategoryarea&quot; class=&quot;editor-field&quot;&amp;gt;
            @Html.Partial(&quot;SubCategoryDropDownList&quot;)
            @Html.ValidationMessageFor(model=&amp;gt;model.Article.SubCategoryId)
        &amp;lt;/div&amp;gt;
        
 
        &amp;lt;p&amp;gt;
            &amp;lt;input type=&quot;submit&quot; value=&quot;Create&quot; /&amp;gt;
        &amp;lt;/p&amp;gt;
    &amp;lt;/fieldset&amp;gt;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;SubCategoryDropDownListビュー&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;div class=&quot;editor-field&quot;&amp;gt;
    @Html.DropDownList(&quot;Article.SubCategoryId&quot;, ViewBag.SubCategoryId as SelectList)
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　何とも分かりにくいサンプルになってしまいましたが、ポイントはCreateビューの「@AJAX.ActionLink()」メソッドと「@Html.Partial()」メソッドです。初回呼出時にはPartialメソッドによって部分ビュー（SubCategoryDropDownList）が呼び出され、カテゴリーのリンククリック時にはActionLinkメソッドで部分ビューが更新されます。ActionLinkメソッドでは動的なパラメータは使えませんと怒られたのでカテゴリーをわざわざViewBagではなくてモデルに配置しています。カテゴリーはとりあえず&amp;lt;li&amp;gt;要素で表してますが、jQueryのプラグインでドロップダウンに見せることもできるでしょう（適当）。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5_DwkBzeLwkYUJmGTOCnJt1u1X5eJC7K57Rb2V8Cs3FCZkkWmWSTcZepOUPicwG5v-qHHojy9zL0auY9W27yf3TX0nLoxqlc1YqQaiL41EGCUI5j6uTiUtNFkayPgnOVxRqpB-38oKgk/s1600-h/2012101801%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012101801&quot; border=&quot;0&quot; height=&quot;316&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrR6bQY9YwkedAT-hJsd38b6vb5SXJG7M0iUf-d5UuTtlz1QLrV4t23BkGhsB4QGWslVJGjS6mPcXLBBXik3QyBYIelAxh3aBX-DvFbbV2QxnPfBsaARzSBgSP9YlNBTXgeKz3-2RLtdE/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012101801&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlu95kwCPTfkL03sMQ59K3NaqoAY1-XpYIFOzBD1zzLRyld3OYHNWjWDYEWd5k0N4xLD7_4ubeWFSV9elZavvWavAWuAFAiSDEYO6ESfxl17tCc0bxwjfhcL_jnH2AFrbBib0LTaw-il4/s1600-h/2012101802%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012101802&quot; border=&quot;0&quot; height=&quot;297&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpMatbiMNqdVcdtYjKieWNjgBZU40vI01vEf9OhTI3Aam1IRx7i6aR1bcPoM_ugkXD1ABywoUx9Ss2L4HUDpn-9R49I4e67W4AjGNk_05ioQyI-A_fK2xPFDr7Z4wJLuDnkPA2xBxqP6U/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012101802&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　以上、久しぶりの更新なのにかなり駆け足でしたが、今日はここまで。…正直、ここまで試行錯誤しすぎて疲れました。</description><link>http://lightstaffblog.blogspot.com/2012/10/aspnetmvc_18.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrR6bQY9YwkedAT-hJsd38b6vb5SXJG7M0iUf-d5UuTtlz1QLrV4t23BkGhsB4QGWslVJGjS6mPcXLBBXik3QyBYIelAxh3aBX-DvFbbV2QxnPfBsaARzSBgSP9YlNBTXgeKz3-2RLtdE/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-5178323567910510040</guid><pubDate>Fri, 12 Oct 2012 08:14:00 +0000</pubDate><atom:updated>2012-10-12T17:17:16.720+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】PartialViewをjQueryでお手軽モーダル表示…に失敗【MVC】</title><description>　なんだかあと一歩な感じなんでメモっとく。&lt;br /&gt;
&lt;br /&gt;
　何がしたいかというとリストから新規作成を選択したらページ遷移せずにモーダルウィンドウで表示してみたいんです。で、色々考えてみた結果、PartialViewとjQueryのjqModalプラグインを使えばできるんじゃねーかという結論にいたったので実験したわけです。結果的に失敗しているので今回もちゃっちゃっとサンプルを載せます。&lt;br /&gt;
&lt;br /&gt;
　jqModalプラグインについてはこちら→&lt;a href=&quot;http://dev.iceburg.net/jquery/jqModal/&quot;&gt;jqModal :: Minimalistic Modaling for jQuery&lt;/a&gt;&lt;br /&gt;
　&lt;br /&gt;
　モデル等については例によって使い回しです。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;Userモデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class User:IValidatableObject
{
    [Required]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public int CategoryId { get; set; } 
        
    public IEnumerable&amp;lt;ValidationResult&amp;gt; Validate(ValidationContext validationContext)
    {
        if(10 &amp;lt; this.Name.Length)
        {
            yield return new ValidationResult(&quot;サーバーサイドで引っかかりました&quot;, new[] { &quot;Name&quot; });
        }
    }
}&lt;/pre&gt;
&lt;br /&gt;
　検証確認のため、適当な検証をくっつけてます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Userコントローラー&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class UserController : Controller
{
    public ActionResult Index()
    {
        var categoris = new List&amp;lt;Category&amp;gt; { 
            new Category { Id = 1, Name = &quot;A&quot; }, 
            new Category { Id = 2, Name = &quot;B&quot; } 
        };
 
        var useres = new List&amp;lt;User&amp;gt; { 
            new User { Id = 1, CategoryId = 1, Name = &quot;Tanaka&quot; }, 
            new User { Id = 2, CategoryId = 2, Name = &quot;Sato&quot; } 
        };
 
        return View(useres);
    }
 
    public ActionResult Create()
    {
        return PartialView();
    }
 
    [HttpPost]
    public ActionResult Create(User target)
    {
        if (ModelState.IsValid)
        {
            //追加処理は省略
 
            return RedirectToAction(&quot;Index&quot;);
        }
 
        return PartialView(target);
    }
}&lt;/pre&gt;
&lt;br /&gt;
　これまたいい加減ですが、Create実行時に目的であるPartialViewで表示するように設定してます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Indexビュー&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;@model IEnumerable&amp;lt;MvcTestProject01.Models.User&amp;gt;
 
@{
    ViewBag.Title = &quot;Index&quot;;
    Layout = &quot;~/Views/Shared/_Layout.cshtml&quot;;
}
 
@section styles{
    &amp;lt;link href=&quot;~/Content/jqModal.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
}
 
@section scripts{
    &amp;lt;script src=&quot;~/Scripts/jqModal.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
 
        function createShow() {
            $(&#39;#jqmdialog&#39;).jqm({
                modal: true,
                ajax: &#39;/User/Create&#39;
            });
            $(&#39;#jqmdialog&#39;).jqmShow();
        }
 
    &amp;lt;/script&amp;gt;
}
 
&amp;lt;h2&amp;gt;Index&amp;lt;/h2&amp;gt;
 
&amp;lt;div id=&quot;jqmdialog&quot; class=&quot;jqmWindow&quot;&amp;gt;&amp;lt;/div&amp;gt;
 
&amp;lt;p&amp;gt;
    &amp;lt;a href=&quot;#&quot; onclick=&quot;createShow()&quot;&amp;gt;Create New&amp;lt;/a&amp;gt;
&amp;lt;/p&amp;gt;
&amp;lt;table&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;th&amp;gt;
            @Html.DisplayNameFor(model =&amp;gt; model.Name)
        &amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;
            @Html.DisplayNameFor(model =&amp;gt; model.CategoryId)
        &amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
 
@foreach (var item in Model) {
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.DisplayFor(modelItem =&amp;gt; item.Name)
        &amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.DisplayFor(modelItem =&amp;gt; item.CategoryId)
        &amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.ActionLink(&quot;Edit&quot;, &quot;Edit&quot;, new { id=item.Id }) |
            @Html.ActionLink(&quot;Details&quot;, &quot;Details&quot;, new { id=item.Id }) |
            @Html.ActionLink(&quot;Delete&quot;, &quot;Delete&quot;, new { id=item.Id })
        &amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
}
 
&amp;lt;/table&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　今回の肝であるjqModalプラグインを設定しています。流れとしては「リンククリックイベント（createShow()）→ダイアログの定義→ダイアログの表示」って感じです。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Createビュー&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;@model MvcTestProject01.Models.User
 
&amp;lt;script src=&quot;~/Scripts/jquery-1.7.1.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;~/Scripts/jquery.validate.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
 
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
 
    &amp;lt;fieldset&amp;gt;
        &amp;lt;legend&amp;gt;User&amp;lt;/legend&amp;gt;
 
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            @Html.LabelFor(model =&amp;gt; model.Name)
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
            @Html.EditorFor(model =&amp;gt; model.Name)
            @Html.ValidationMessageFor(model =&amp;gt; model.Name)
        &amp;lt;/div&amp;gt;
 
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            @Html.LabelFor(model =&amp;gt; model.CategoryId)
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
            @Html.EditorFor(model =&amp;gt; model.CategoryId)
            @Html.ValidationMessageFor(model =&amp;gt; model.CategoryId)
        &amp;lt;/div&amp;gt;
 
        &amp;lt;p&amp;gt;
            &amp;lt;input type=&quot;submit&quot; value=&quot;Create&quot; /&amp;gt;
        &amp;lt;/p&amp;gt;
    &amp;lt;/fieldset&amp;gt;
}
 
&amp;lt;div&amp;gt;
    @Html.ActionLink(&quot;Back to List&quot;, &quot;Index&quot;)
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　こっちは何の変哲もないビューです。使ってみて初めて気がつきましたが、どうやら部分ビューは部分ビューでjquery等を定義してないと動かない模様です。最初これ飛ばしててクライアント検証が発生しなくてかなり困りました。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果（Index表示時）&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSxub1kF6m6IrwRMPvOKLfMeS7PMnAyuTZs9fpYKc1-ceDlS-gd8EnyOAI5Y-tgzWBef7ihRHlCIIAvTzZ0nCayAdhJkO7JvIjcTDf_d1QJkKejmWXXhPHKu5q2vEVoObX8ZbkNshgoC4/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;249&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_f57nZ9EZq1DLXt8YWD6OdERyL9ESC92jgwnr7GLn5hhXRZnKLdAlvbGbmUc0gVZsIG2rQ9uLF-YSAGhjyqTSbYi7N3DzRUeXyhy7IAS1ULCWq32KPjXUcj91IwUk2qC7WfD-qOmxi3E/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果（Createクリック時）&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1zMYQ6raE7Na2l0clwYDKoM9BP1Txj7rM7FnY7K_PihiAEh3BWIoo3N5cTz5r0fCqiRaJAxvo3tw0EDxHRiMR0_FDjCmIzOWgVYRZnK-rj3IgIo6nf-3_1qp_c3px-eGHdxuMFi7vZBw/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;239&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhydlGsxeMErja1ld0WZdgrWl2Ao-8IUlAyvVkFgmWAQuGFuSFht-kMRQb2nstiavAOHdoxalXC5CtIoVx5YLzwDx2_3Wn_SGD-_hxmRvlPDscOL8_UyGVKKrLlXoqvW92QMrUKv5Gw5D4/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　おぉー、出来た出来た！…と思いきや。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果（サーバーサイド検証時）&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-jCHG0qFBPY8ovxYUlRlh5Gm_IGlylJUJV_zQbONwmlAmZS3D23CR1Y3AMgUD6WgzirGDkEVOq9BgHoZ4BxDPBUB_XMXXC4BBQOuPctTrG4LD50k35EF_3NiWKxYWTsMyFcc_c2H47fc/s1600-h/image%25255B12%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;234&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC9hx64llEfipaZkXwO7Ye3Fwi65w8nf_IPUt3ILuz0-qUJqK7dyScyxCX4p5ycX3H4gKWR0Y4STKBluzDOk_dyKWrL3Phy9G3DcUVg0SmEyfZRex1bN2h5h7APasAL6aUpM2SKxuqWfY/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　ちょっと分かりづらいんですがサーバーサイドで検証に引っかかってもう一度PartialView()が実行されるとモーダル表示が解けるどころかページ遷移が発生しちゃってるんですよ。アドレスも思いっきり「User/Create」って出ちゃってます。&lt;br /&gt;
&lt;br /&gt;
　…そして今に至るわけです。ちょっと手の込んだことしないと解決できなそうな気がする。何とかできたら追記するかも？</description><link>http://lightstaffblog.blogspot.com/2012/10/aspnetpartialviewjquerymvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_f57nZ9EZq1DLXt8YWD6OdERyL9ESC92jgwnr7GLn5hhXRZnKLdAlvbGbmUc0gVZsIG2rQ9uLF-YSAGhjyqTSbYi7N3DzRUeXyhy7IAS1ULCWq32KPjXUcj91IwUk2qC7WfD-qOmxi3E/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-6409620887854879994</guid><pubDate>Tue, 09 Oct 2012 10:43:00 +0000</pubDate><atom:updated>2012-10-09T19:46:30.295+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">雑記</category><title>【雑記】久しぶりに本日の箇条書き</title><description>&lt;ul&gt;
&lt;li&gt;最近まじめにコード書いてるのでネタが無い。&lt;/li&gt;
&lt;li&gt;CodeFirstのSeedメソッドで詰む。パッケージマネージャーコンソールが「System.Data.Entity.Validation.DbEntityValidationException: 1 つ以上のエンティティで検証が失敗しました。詳細については &#39;EntityValidationErrors&#39; プロパティを参照してください。」と仰る。モデルに付けた検証が引っかかってるみたいだけどコンソールじゃプロパティ見れないよって話で…。仕方が無いのでコードから手動でSeedメソッド呼び出した。&lt;/li&gt;
&lt;li&gt;ディスプレイを1台LEDのフルHDにしてから目がチカチカしてたのに限界を感じ、今まで面倒で避けてたけどNVIDIAのコントロールパネルで微調整してみた。ついで古い方の黄ばみ消しにも挑戦してみた。新しい方は明るさ・コントラスト・ガンマをがっつり下げてこれってほんとにLED？（笑）みたいな暗さにしてやった。古い方の黄ばみは青色強くしたりしてみたけど、やっぱり黄色い、これはもう修正不可能なレベルなんだなぁと思い知った。ついでに開発環境も配色テーマを濃色に変えて暗くしてやった。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=252926.494&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;HP Directplus オンラインストア&quot; border=&quot;0&quot; src=&quot;http://h50146.www5.hp.com/directplus/aff_banner/bnr_personal/desktops/2012/09/0910/468x60.gif&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=252926.494&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/10/blog-post.html</link><author>noreply@blogger.com (LightstaffBlog)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-6348647957365313701</guid><pubDate>Sat, 06 Oct 2012 02:20:00 +0000</pubDate><atom:updated>2012-10-06T11:20:09.331+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【C#】列挙型での日本語の取り扱い…ついてでにMVCも【MVC】</title><description>　列挙型で日本語っつーか全角文字列の扱いってどうすりゃいんだ？っての話の始まりです。どういうことかというと下記のコードを見てもらった方が早いでしょう。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;列挙型A&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public enum Positions
{
    Start,
    Middle,
    End
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;列挙型B&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public enum Positions
{
    最初,
    間,
    最後
}&lt;/pre&gt;
&lt;br /&gt;
　どっちでいいだろ？って言われたらお終いなんですが、今まで半角英数で統一してんのに列挙型だけ例外とするのも気持ちが悪いというか…。当然、開発上のルールとしてメンバは必ず半角英数でって話だってあると思うのでとりあえず何とかしたいと思ったわけです（そんなものとは無縁の世界で生きてはいますが…）。&lt;br /&gt;
&lt;br /&gt;
　一番簡単な案としては列挙型をやめちゃってDictionaryなりListなりのユーザー定義型でやっちゃえばいいんですが、それだと根本的な趣旨から外れちゃうんで却下。で、色々と調べたところカスタム属性を使う方法等もあったんですが今回は拡張メソッドで何とかなりそうだぞってことが分かったのでこれでやってみます。（参考にさせていただいた記事：&lt;a href=&quot;http://d.hatena.ne.jp/siokoshou/20080124#p1&quot;&gt;当面C#と.NETな記録&lt;/a&gt;）（ついでにMSDN：&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/vstudio/bb383974.aspx&quot;&gt;方法 : 列挙型対応の新しいメソッドを作成する&lt;/a&gt;）&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;列挙型Aに拡張メソッドを実装&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public enum Positions
{
    Start,
    Middle,
    End
}
 
public static class PositonExtensions
{
    public static string GetDisplayName(this Positions position)
    {
        switch (position)
        {
            case Positions.Start:
                return &quot;最初&quot;;
            case Positions.Middle:
                return &quot;間&quot;;
            case Positions.End:
                return &quot;最後&quot;;
            default:
                return string.Empty;
        }
    }
}&lt;/pre&gt;
&lt;br /&gt;
　コード自体はシンプルです。さて、これで今日は終了としても良いですが、このままじゃ中身のないマルパク記事じゃねーかって話になっちゃうので&lt;strike&gt;使い回しで&lt;/strike&gt;&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/10/aspnetviewbagdropdownlistmvc.html&quot;&gt;この間作ったサンプル&lt;/a&gt;にこの列挙型を追加して、MVCで表示してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Userモデルを修正&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class User
{
    //・・・中略

    public Positions Position { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;コントローラーを修正&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Edit()
{
    //・・・中略

    //SelectListで使えるようLinqを使って定義してみた
    var divisons = from p in (Positions[])Enum.GetValues(typeof(Positions))
                    select new
                    {
                        Value = p,
                        Display = p.GetDisplayName()
                    };
 
    ViewBag.Positions = new SelectList(divisons, &quot;Value&quot;, &quot;Display&quot;, user.Position);
 
    return View(user);
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;ビューを修正（一部抜粋）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;&amp;lt;div class=&quot;editor-label&quot;&amp;gt;
    @Html.LabelFor(model =&amp;gt; model.Position)
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;editor-field&quot;&amp;gt;
    @Html.DropDownListFor(model =&amp;gt; model.Position, ViewBag.Positions as SelectList)
    @Html.ValidationMessageFor(model =&amp;gt; model.Position)
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDlFu-VqlIUMq1Iree7Sgn2II6O2Y2J1RJWuL08LC-XpnQ0K7k5RFMVX2s8cJFOBt-8Jw5lRho1sUly7Dxl3C3bpwXqq_djgNYAd7-kgix-f7u6mFwkktW7qNqjmWCsjPKMpVs3CyQxx4/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;519&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzBR60VCeRYcXZmNFmFfSPfoOczHupyoPopEfdKCNCQ2zlEJyHQwCFVFMFLtQVg_xnGgcgA0KtZXmcnsNbYJAziWt4VQsncqejT_L27F4Jp4nvlE11ug3mAYwCszhw_jGUS21N7rof5DI/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　駆け足ですがこんな感じになります。コントローラーでのViewBagのSelectListに値と表示を定義するためにLINQを使った以外はほとんど過去記事と変わりません。&lt;br /&gt;
&lt;br /&gt;
　では今日はここまで。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://linksynergy.jrs5.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=252693.54&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;ビックカメラ.com&quot; border=&quot;0&quot; src=&quot;http://www.biccamera.com/linkshare/images/480x60/speeddelivery.gif&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=252693.54&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/10/cmvcmvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzBR60VCeRYcXZmNFmFfSPfoOczHupyoPopEfdKCNCQ2zlEJyHQwCFVFMFLtQVg_xnGgcgA0KtZXmcnsNbYJAziWt4VQsncqejT_L27F4Jp4nvlE11ug3mAYwCszhw_jGUS21N7rof5DI/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-2785103723836342934</guid><pubDate>Wed, 03 Oct 2012 02:40:00 +0000</pubDate><atom:updated>2012-10-03T11:40:36.568+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】ViewBagを利用してDropDownList【MVC】</title><description>　最近こればっかだけどまたまたMVCネタです。&lt;br /&gt;
&lt;br /&gt;
　&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/aspnetmvc44mvc.html&quot;&gt;以前の記事&lt;/a&gt;でDropDownListはモデル側にListを用意してやらんといかんと書きましたが、ViewBagを利用することで簡単に作成することができることが分かっちゃったので…。&lt;br /&gt;
&lt;br /&gt;
　大した内容じゃないのでちゃちゃっとサンプルのみ書きます。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;Userモデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CategoryId { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Categoryモデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;コントローラー（Editのみ）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Edit()
{
    //今回は横着します
    var user = new User { Id = 1, CategoryId = 1, Name = &quot;Tanaka&quot; };
    var categoris = new List&amp;lt;Category&amp;gt; { new Category { Id = 1, Name = &quot;A&quot; }, new Category { Id = 2, Name = &quot;B&quot; } };
 
    //ViewBag定義
    ViewBag.Categories = new SelectList(categoris, &quot;Id&quot;, &quot;Name&quot;, user.CategoryId);
 
    return View(user);
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;ビュー&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
 
    &amp;lt;fieldset&amp;gt;
        &amp;lt;legend&amp;gt;User&amp;lt;/legend&amp;gt;
 
        @Html.HiddenFor(model =&amp;gt; model.Id)
 
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            @Html.LabelFor(model =&amp;gt; model.Name)
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
            @Html.EditorFor(model =&amp;gt; model.Name)
            @Html.ValidationMessageFor(model =&amp;gt; model.Name)
        &amp;lt;/div&amp;gt;
 
        &amp;lt;div class=&quot;editor-label&quot;&amp;gt;
            @Html.LabelFor(model =&amp;gt; model.CategoryId)
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
            @Html.DropDownListFor(model =&amp;gt; model.CategoryId, ViewBag.Categories as SelectList)
            @Html.ValidationMessageFor(model =&amp;gt; model.CategoryId)
        &amp;lt;/div&amp;gt;
 
        &amp;lt;p&amp;gt;
            &amp;lt;input type=&quot;submit&quot; value=&quot;Save&quot; /&amp;gt;
        &amp;lt;/p&amp;gt;
    &amp;lt;/fieldset&amp;gt;
}&lt;/pre&gt;
&lt;br /&gt;
　ViewBagっていまいち分かってなかったけど便利なんですね。でも何でもかんでも突っ込むと碌なことになさそうな気もするなぁ。&lt;br /&gt;
&lt;br /&gt;
　今日はこんだけ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=252926.494&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;HP Directplus オンラインストア&quot; border=&quot;0&quot; src=&quot;http://h50146.www5.hp.com/directplus/aff_banner/bnr_personal/desktops/2012/09/0910/468x60.gif&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=252926.494&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/10/aspnetviewbagdropdownlistmvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-7084152997910566396</guid><pubDate>Tue, 02 Oct 2012 04:10:00 +0000</pubDate><atom:updated>2012-10-02T13:10:18.907+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】個人的な検証機能のおさらい　クライアントサイド編【MVC】</title><description>　&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/aspnetmvc_28.html&quot;&gt;サーバーサイド編&lt;/a&gt;に続き、今回はクライアント編です。&lt;br /&gt;
&lt;br /&gt;
　ひとえにクライアント編とは言ってもクライアント側であればスクリプト次第で色々と方法はあるとは思いますが、今回はjQueryのValidateプラグインを使ってみます。&lt;br /&gt;
　まずは基本的な使い方から。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Editビューへの追加（一部抜粋）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;script src=&quot;~/Scripts/jquery-1.8.2.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;~/Scripts/jquery.validate.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    $(function () {
        $(&#39;form&#39;).validate({
            rules: {
                UserName: { maxlength: 50 },
                Birthday: { date: true },
                Email: {
                    required: true,
                    email: true
                },
                CompareEmail: {
                    required: true,
                    equalTo: &#39;#Email&#39;
                },
                Tell: { number: true }
            },
            messages: {
                UserName: &#39;UserNameは最大50字までです&#39; ,
                Birthday: &#39;Birthdayが不正です&#39;,
                Email: {
                    required: &#39;Emailは必須項目です&#39;,
                    email: &#39;Emailが不正です&#39;
                },
                CompareEmail: {
                    required: &#39;Emailは必須項目です&#39;,
                    equalTo: &#39;入力されたEmailと異なっています&#39;
                },
                Tell: &#39;Tellが不正です&#39;
            }
        })
    });
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　マスターページやレイアウトページがあるならjQuery本体やValidateプラグインはそっちに配置してしまえばOKです。検証の設定は見ての通りって感じですが、一応解説すると「$（’form’）.validate(…)」でこのページのすべてのformを検証の対象としています。「rules:」プロパティは各name属性に検証のルールを定義しています。「messages:…」は引っかかった際のメッセージを定義しています。プロパティ等の詳細については&lt;a href=&quot;http://docs.jquery.com/Plugins/Validation&quot;&gt;こちら（Plugins/Validation - jQuery Wiki）&lt;/a&gt;を確認してください。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-rmJL8s-skUMSIEnXDMvFcHWJKjfR0uQfS379JojTfdOl_sy5QT9dkvoNf3MzQcAyOTex0_PhJ3J-Kq1wWUyGNp5KrWHbKVFI_9UFDEnu9aYGjD-_R1xkZBYJAqkJP0PRMqUn7lqWJH8/s1600-h/image%25255B22%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;572&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7GgBSDHL_S1EnD7ch2adna1xJun9xhkYsQMqFNAUQWysWqwtjCcnqv7ZZrhSIhJrXFx2ZQUza-4cuYZN_2kheg8NzvCt-HtqBlb69Sogri6PQiWjSApBUPIrCgHB730FuHxEbFP58vNI/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　やっぱりプラグインは便利ですね～。でも、これじゃサーバーサイドの定義とクライアントサイドの定義で2度手間じゃねーの？って感じちゃいます。そこでMS製のValidateプラグインの派生プラグイン（？）「jquery.validate.unobtrusive」を利用します。これはNuGetで取得できます。これを読み込むだけでサーバーサイドで定義した検証をクライアントサイドで動作させることができます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Editビューへの追加（一部抜粋）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;script src=&quot;~/Scripts/jquery-1.8.2.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;~/Scripts/jquery.validate.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- とりあえず以下はコメントアウトしときます
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    $(function () {
        $(&#39;form&#39;).validate({
            rules: {
                UserName: { maxlength: 50 },
                Birthday: { date: true },
                Email: {
                    required: true,
                    email: true
                },
                CompareEmail: {
                    required: true,
                    equalTo: &#39;#Email&#39;
                },
                Tell: { number: true }
            },
            messages: {
                UserName: &#39;UserNameは最大50字までです&#39;,
                Birthday: &#39;Birthdayが不正です&#39;,
                Email: {
                    required: &#39;Emailは必須項目です&#39;,
                    email: &#39;Emailが不正です&#39;
                },
                CompareEmail: {
                    required: &#39;Emailは必須項目です&#39;,
                    equalTo: &#39;入力されたEmailと異なっています&#39;
                },
                Tell: &#39;Tellが不正です&#39;
            }
        })
    });
&amp;lt;/script&amp;gt;
--&amp;gt;&lt;/pre&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&lt;/pre&gt;
&lt;br /&gt;
　ほんとに読み込んだだけですが、実行してみましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果（Post発生前）&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8t45voJRxw2mZL2rx98i9Umo2RlH0BCqL3UZMf65MNtfzJgHPOpqUwO9f_buFVTLKNdh4BX-o6uWcojTcKPd4PUP6Fk2N0e5l-AIryriuGhxNQkzEAj8JguVMKvjIRU6YcAlVVAwWIEM/s1600-h/image%25255B13%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;432&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQd8FshzDIRWFfM6i9liTfKfKvbt0sV_M26CBw6r7_siYxH-Wtu5xvPlQ_d20_dHTyIO8LXwncYrwMjlZKbjbybod3yhkp84g4gTvDFvBUNg4AjzzSpLCltgRRgqd4iSTnyzWqmB39-R0/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　見ての通り、Post発生前でありながら前回のPost発生後と同じ画面になっています。たったこれだけで、前半部分が無駄になっちゃいました。まぁValidateプラグインの知識のひとつということにしときます。&lt;br /&gt;
&lt;br /&gt;
　さて、次は独自の検証機能を持った属性を用意してサーバーサイドとクライアントサイドで連携してみたいと思います。前回紹介しなかった「System.ComponentModel.DataAnnotations.ValidationAttribute」クラスの出番です。これと「System.Web.Mvc.IClientValidatable」インターフェースを組み合わせて利用します。早速、独自検証クラスを作ります。検証内容は「Birthdayが18歳以上か？」で考えてみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;独自検証クラス&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class UserMinorAttribute : ValidationAttribute, IClientValidatable
{
    //エラーメッセージの初期化
    public UserMinorAttribute()
    {
        this.ErrorMessage = &quot;18未満の方は登録できません。（サーバーサイド）&quot;;
    }
 
    //検証
    public override bool IsValid(object value)
    {
        var birthday = value as DateTime?;
 
        if (birthday != null &amp;amp;&amp;amp; birthday &amp;lt;= DateTime.Now.AddYears(-18))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
 
    //クライアントサイド用定義
    public IEnumerable&amp;lt;ModelClientValidationRule&amp;gt; GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
            {
                ErrorMessage = &quot;18未満の方は登録できません。（クライアントサイド）&quot;,
                ValidationType = &quot;userminor&quot;
            };
 
        yield return rule;
    }
 
}&lt;/pre&gt;
&lt;br /&gt;
　インターフェースのメンバである「GetClientValidationRulesメソッド」って分かりづらい感ばりばりですが、今回は「userminor」というクライアントで使用する検証の名前とエラーメッセージを定義してるだけです。検証に別のパラメータ等を使用する場合はここで定義することができます（今回はややっこしくなるのでやめました）。次にモデルにこの属性を定義します。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Userモデルへの追加&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class User : IValidatableObject
{
 
    public int UserId { get; set; }
 
    [StringLength(50)]
    public string UserName { get; set; }
 
    [Column(&quot;Gender&quot;, TypeName = &quot;int&quot;)]
    [EnumDataType(typeof(Genders))]
    public Genders Gender { get; set; }
 
    [UserMinor]
    public DateTime Birthday { get; set; }
 
    [RegularExpression(@&quot;[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}&quot;, ErrorMessage = &quot;アドレスが不正です。&quot;)]
    public string Email { get; set; }
 
    [Compare(&quot;Email&quot;, ErrorMessage = &quot;入力されたアドレスと異なっています。&quot;)]
    public string CompareEmail { get; set; }
 
    [RegularExpression(@&quot;[0-9]*$&quot;, ErrorMessage = &quot;半角数値のみで入力して下さい。&quot;)]
    public string Tell { get; set; }
 
    public IEnumerable&amp;lt;ValidationResult&amp;gt; Validate(ValidationContext validationContext)
    {
        using (var context = new MyContext())
        {
            var overlap = context.Users.Where((p) =&amp;gt; p.UserName == this.UserName).FirstOrDefault();
 
            if(overlap !=null)
            {
                yield return new ValidationResult(&quot;そのユーザー名は既に使われています。&quot;, new[] { &quot;UserName&quot; });
            }
        }
    }
}&lt;/pre&gt;
&lt;br /&gt;
　こっちは「Birthday」に「UserMinor」属性をつけただけでお終いです。ちなみにこのままで実行すると他の属性とは異なり、サーバーサイドでの検証は発生しますが、クライアントサイドでの検証は発生しません。一応、実行結果載せます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果（Post発生後）&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMPSPeQ-mVrON3mK-bxp2o7NgMlZK-ye-sUqJn3J7AhKUAx3MFLOAtIBXiBlbmpPfy-jXX0-BdOBGo0kQp_PylhVoUz0RjcGKW6NvcjHxbc_I5oNHwmNv0fFAnyU38yIJnoCtejADAjds/s1600-h/image%25255B21%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;432&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBkzAO2Z91B_8-7fsd062hRzoEtMmUsJA7RQqGx53qII6qgkz4ADoYxcrcaW-fA-hLMlYV53S5Fp9HHS6A4TXMPgZv4oft3kYniXpdUfgJctQjfvPcuumJUmxu3nwwHOwsmYAFH7qruzg/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　これをクライアントサイドでも検証が発生するようにスクリプトを定義します。これに関しては、はっきり言って2度手間です。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Editビューへの追加（一部抜粋）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    $.validator.addMethod(&#39;userminor&#39;, function (value, element, params) {
        var today = new Date();
        var overYear = today.getFullYear() - 18;
        var overBirthday = new Date(overYear, today.getMonth(), today.getDay());
 
        if (!value) {
            return true;
        } else {
            if (overBirthday &amp;lt; Date.parse(value)) {
                return false;
            } else {
                return true;
            }
        }
    });
 
    $.validator.unobtrusive.adapters.addBool(&#39;userminor&#39;);
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　サーバーサイドでの検証はValidateプラグインの「addMethod」関数とUnobtrusiveプラグインの「addBool」関数を利用します。前者で検証内容を定義し、後者で検証のパラメータ等を登録します。今回はパラメータがないので「addBool」関数を使用していますが、パラメータがある場合、別の関数を利用したり、独自に定義したりすることができます。以下、実行結果です。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果（Post発生前）&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI5Atix_4us5T2EAOUejkV0zSAKeLo3Yw2m0NoTRiG6voZ3SpQTW9JiJPJ6V20B38IPEAO56IzuUyIMmXDn9f7VPMEYGvV4q3BSCjC0Lr4b-VZNQgR_5QsNVr9a3K7lNw3gPesAWxCsQM/s1600-h/image%25255B26%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht0htMqLKG5pnStKAwv51b1Qvd-GPrOe_8dAOL1T_Hsh28zxaoAcltI5gcS90JtrZ6TXlqOlbcxTJbtCRaSAaOB6d-UMxZAi6x2mNXvKSIc8ys_pL59OsUP8Xc1JiwdkZjNv_nfATLc5c/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　う～ん、何かここまですると&lt;strike&gt;面倒くさいから&lt;/strike&gt;独自検証に関してはサーバーサイドだけでいいんじゃ？って気もしないでもないですね。まぁ、無駄なトラフィックを発生させたくなければって感じでしょうか？&lt;br /&gt;
&lt;br /&gt;
　というわけで今回はここまで。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;br /&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=39250.10000701&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;デル株式会社&quot; border=&quot;0&quot; src=&quot;http://i.dell.com/images/jp/banners/banners_l/dell_con_728x90_2.gif&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=39250.10000701&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/10/aspnetmvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7GgBSDHL_S1EnD7ch2adna1xJun9xhkYsQMqFNAUQWysWqwtjCcnqv7ZZrhSIhJrXFx2ZQUza-4cuYZN_2kheg8NzvCt-HtqBlb69Sogri6PQiWjSApBUPIrCgHB730FuHxEbFP58vNI/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-7904242531198438473</guid><pubDate>Fri, 28 Sep 2012 01:56:00 +0000</pubDate><atom:updated>2012-09-28T10:56:01.034+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】個人的な検証機能のおさらい　サーバーサイド編【MVC】</title><description>　今回は個人的にMVCの検証機能をちょっと復習したいなと思いまして…。長ったらしくなりそうなのでサーバーサイド編とクライアントサイド編で分けて載せます。&lt;br /&gt;
&lt;br /&gt;
　というわけで今回はサーバーサイド編です。サーバーサイドでの基本的な検証はモデルに検証用の属性をつけることで実装します。独自に定義したい場合は「ValidationAttribute」　を継承した属性を作成するか、モデルに「IValidatableObject」インターフェースを実装します。&lt;br /&gt;
&lt;br /&gt;
　とりあえず基本的な属性付けから。&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/aspnetmvc.html&quot;&gt;前回&lt;/a&gt;使用したUserモデルを流用します。…といか元々はこれように作ったモデルだったりする。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;Userモデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class User
{
 
    public int UserId { get; set; }
 
    public string UserName { get; set; }
 
    [Column(&quot;Gender&quot;, TypeName = &quot;int&quot;)]
    public Genders Gender { get; set; }
 
    public DateTime Birthday { get; set; }
 
    public string Email { get; set; }
 
    public string CompareEmail { get; set; }
 
    public string Tell { get; set; }
        
}&lt;/pre&gt;
&lt;br /&gt;
　これに検証を設ける場合、ぱっと見思いつくのは…&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;UserNameの文字列数 &lt;/li&gt;
&lt;li&gt;Emailの正規表現 &lt;/li&gt;
&lt;li&gt;CompareEmailのEmailとの差異 &lt;/li&gt;
&lt;li&gt;Tellの正規表現&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
　ってとこでしょうか？&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Userモデル（検証属性追加）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class User
{
 
    public int UserId { get; set; }
 
    [StringLength(50)]
    public string UserName { get; set; }
 
    [Column(&quot;Gender&quot;, TypeName = &quot;int&quot;)]
    [EnumDataType(typeof(Genders))]
    public Genders Gender { get; set; }
 
    public DateTime Birthday { get; set; }
 
    [RegularExpression(@&quot;[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}&quot;, ErrorMessage = &quot;アドレスが不正です。&quot;)]
    public string Email { get; set; }
 
    [Compare(&quot;Email&quot;, ErrorMessage = &quot;入力されたアドレスと異なっています。&quot;)]
    public string CompareEmail { get; set; }
 
    [RegularExpression(@&quot;[0-9]*$&quot;, ErrorMessage = &quot;半角数値のみで入力して下さい。&quot;)]
    public string Tell { get; set; }
        
}&lt;/pre&gt;
&lt;br /&gt;
　こんな感じになります。各属性の詳細は&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/system.componentmodel.dataannotations(VS.100).aspx&quot;&gt;こちら（System.ComponentModel.DataAnnotations 名前空間）&lt;/a&gt;。んで下図が全部引っかかってみた例です。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Createビュー実行結果（Post発生後）&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZlOxP2gabJSfzUVkkEZ9O3d0Vji1enlW8x9raZIVHDscPg1D4VnGFWey0YqXSrfRbPyLyINL4lJKBtZ5Dmq7tghB33aMO0f_VyHmjxzdozipAFB82wjDH1JCUpN_D5arDCP_QuifeV0g/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;406&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwRXu0WtlTuIIiJ59lxK-e5iECcoymqujNNZBEw4ItnhyphenhyphenxJNPOw6ydax4rAjjnb2yvBfWEJuby4QAsK8fYYQqKFMHHGrnpohlRTGcW5YeJTWLWlzkaxQ3j6206k7IUpFWVgADaFQWZsFE/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　当然ながらサーバーサイドなのでPost発生後に検証されます。実にシンプルで簡単です。次に「ValidationAttribute」は置いておいて「IValidatableObject」を使ってみます。検証内容は「入力されたUserNameが既にデータベースに登録されていないか？」です。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;IValidatableObject実装&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class User : IValidatableObject
{
 
    //・・・中略
 
    public IEnumerable&amp;lt;ValidationResult&amp;gt; Validate(ValidationContext validationContext)
    {
        using (var context = new MyContext())
        {
            var overlap = context.Users.Where((p) =&amp;gt; p.UserName == this.UserName).FirstOrDefault();
 
            if(overlap !=null)
            {
                yield return new ValidationResult(&quot;そのユーザー名は既に使われています。&quot;, new[] { &quot;UserName&quot; });
            }
        }
    }
}&lt;/pre&gt;
&lt;br /&gt;
　中身は見ての通りです。この検証は必ず実行され、下図の通りに検証されます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Createビュー実行結果（Post発生後）&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg26CeMsdvRA-9Gl7UgRUNa5mMgx_MJzas9-RsJDZmBeET9t82VyCcC2sPfPjHDVP_cfFXL_HkchGQJzUD1_-Z0_jhlLQtNMAT7B6oyZYLVa7TqErVFNfoaIUGJ85oz8RmTTODScfAuPuc/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;542&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb24XFLdEUspPTmXfCeBfrEACujblj6oEwo3WRH2JN4o1fvP7QWSmzNFaNaK2Qiy3QXpy_Vs0fip8TS6B_tv3L0uV0S0hxDNwOa2dtfvyCZc9mufovIPABUDB8p_NY6JcDsCffWR0igiA/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　これまた期待通りに動作しています。このインターフェースを使えば異なるメンバの比較等の検証を行うことも可能ですね。&lt;br /&gt;
&lt;br /&gt;
　さて、本日はこの辺でお仕舞いで、ValidationAttributeに関してはサーバーサイドでの検証にも利用するのでサーバーサイド編で…。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=169194.10000937&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;いきなりPDF Ver.2&quot; border=&quot;0&quot; src=&quot;http://www.sourcenext.com/~/media/Images/af/ls/2012/pc_ikp_000853/468x60.jpg&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=169194.10000937&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/aspnetmvc_28.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwRXu0WtlTuIIiJ59lxK-e5iECcoymqujNNZBEw4ItnhyphenhyphenxJNPOw6ydax4rAjjnb2yvBfWEJuby4QAsK8fYYQqKFMHHGrnpohlRTGcW5YeJTWLWlzkaxQ3j6206k7IUpFWVgADaFQWZsFE/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-1634568979069966487</guid><pubDate>Thu, 27 Sep 2012 07:30:00 +0000</pubDate><atom:updated>2012-09-27T16:30:42.763+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】ビューで列挙型のドロップダウンリストを表示【MVC】</title><description>　EntityFrameworkで列挙型もサポートされることだし、モデルに列挙型使ってドロップダウンリストで表示してみようぜってな話です。早速、モデルと列挙型を用意します。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;モデル：User&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class User
{
 
    public int UserId { get; set; }
 
    public string UserName { get; set; }
 
    [Column(&quot;Gender&quot;, TypeName = &quot;int&quot;)]
    public Genders Gender { get; set; }
 
    public DateTime Birthday { get; set; }
 
    public string Email { get; set; }
 
    public string CompareEmail { get; set; }
 
    public string Tell { get; set; }
        
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;列挙型:Genders&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public enum Genders
{
    Male = 1,
    Female
}&lt;/pre&gt;
&lt;br /&gt;
　Gendersって何やねんって感じですが、分かりやすくするため無理矢理複数形にしました。EntityFramework対応でモデルの方にColumn属性をつけてます。これでアプリ側ではGenders列挙型、データベース側ではint型で扱われるわけです。&lt;br /&gt;
　ではモデルを元にコントローラーとビューを作ります。今回は0からではなく「EntityFrameworkを使用した…」テンプレートを使ってちゃっちゃっと作ってしまいましょう（この辺の課程は省略）。ウィザードによってIndexビューやEditビューができあがると思います。ここでやってみて分かったんですがモデルに列挙型を使っているとそのメンバだけテンプレートから弾かれちゃうみたいです。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実際のEditビューの実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoMm4OwJlmmJ4q3VL2Noda7sXK61U0tWSjQHPzKFX8yMBPlhzi6mbaBFSvoKvv09PxHsHt7UBCzqUJC-Wp90Iu5kNWB1htsBj3AMjbcvEhIOYM6NcAbuUwIdNTCh3gZw3-ntrCiN8XMkI/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;453&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdX7YjQJ8TN6SeOO3B6Xc5xITHpeVLv4hRVgGL4PZcjr7RcoTfm1VBW3K8ucTHLxPaMTLS0eI1ytr8f-D8quzpKwGsoP7IExIaEd306UVujbc7lDuH4v7MWaUzY3u_WnbDcLXZbs1dOE/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
　見ての通りGenderの項目がありません。まぁこれだけの話だったらHtmlヘルパーの「EditorFor()」とか使ってテキストボックスを自力で用意すればいい話なんですが、せっかく列挙型使ってんだからドロップダウンリストにしたらどうなのって思ってしまったわけです。&lt;br /&gt;
&lt;br /&gt;
　ここでやっと本題です。ドロップダウンリスト自体はHtmlヘルパーの「DropdownListFor()」で作れるんですが、どうやって列挙型の値をデータソースして渡すことができるのかってのが問題になってきます。ユーザー定義型つくってList化して渡すってのも出来なくもないですが、ちょっと回りくどいので今回は却下します。まぁ、長々書いても仕方ないので答えから書いちゃいますが以下をビューに追加します。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ビュー（Edit）に追加&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;div class=&quot;editor-label&quot;&amp;gt;
    @Html.LabelFor(model =&amp;gt; model.Gender)
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;editor-field&quot;&amp;gt;
    @Html.DropDownListFor(model =&amp;gt; model.Gender, new SelectList(Enum.GetValues(Model.Gender.GetType())))
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　簡単に解説すると「Enumクラス」の「GetValues」メソッドで列挙型の値を取得し、リストを渡してます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;追加後の実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_23r__DgTBPucJyZAjgJeMd97sdwMm4EEtQaWMKkW7ow_eFnmKGiLwaLvN6VpVPPMdOOu6xubFyKbr_oP117rf9VtwjVqWkbY6TI1r4kUObaOMMIly0aXzKNCssPE0_lJyzJxfw6kzdE/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;470&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWJjGrK0KaFK9m0GuVpm3JnhO1AjgEbRTVmlS6I-PD3fqOvuPjOrJ6IESp2PZfW1RWHxIkIm0L6gM1LvAWW6oRmrqXdl9HhKquRyxSf2zsLdw7ElyieGFYjeA56P09zMYPA2NFvuzwb8A/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　ばっちり、列挙型でドロップダウンリストが出来ました。でもこれで調子に乗ってCreateビューも同じようにやってみると…。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Createビューの実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQMrbcEIcRshUPU_hbdFU_mriLs21XSGFLiRotqwfJKUNgPwMMzq9yvaMvJQrQgOtv7C9ZH4bPho7cGYwCweq33NZ9fdKShwdHvv7kXkoTj7fkFkQgsLeocgbMhtr3g79sEGL-aOCUvks/s1600-h/image%25255B13%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;254&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieteOGCq7kqyJJW3Nk8gIkq_Yq-1K6qi945gtdkyy18J3vPxudkN2WfwYRkjJRNBKd3HJzVoc9eUG0vS_JV9uDo8-VeNaFApnma3pUIM0k8qfOg-vZDCZXcbv7aH9Sfw_R9RBubxRdiDY/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　NullだよNullってわけです。モデルがインスタンス化されてない模様です。これの原因はコントローラー側も見れば一目瞭然です。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Createメソッド&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Create()
{
    return View();
}&lt;/pre&gt;
&lt;br /&gt;
　うーん、まさに何もしてないわけです。ここで頑張ってモデル側がNullでもどうにかしちゃう拡張ヘルパーを作ってもいいかもしれませんが、ここは手っ取り早くCreateメソッドの方に手を加えて解決にしちゃいます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Createメソッドの修正&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Create()
{
    var model = new User();
 
    return View(model);
}&lt;/pre&gt;
&lt;br /&gt;
　当たり前ですがこれでモデルはインスタンス化されビューに渡されます。一応、実行結果を貼っておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;修正後の実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigt2ZVvyv65yqhmxdIgL585w73jSaCNd-NICYBzrnvo2DLhnYqoa9WLCuk4oXtexu2hOSUC3cUyM-hNz_fTk-CF1IOsEtHqgqEwx-Gl4uCZU91Hf3z9Fzjot8UXqqYiqXJYGMOmWFA7UY/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;475&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihXJHEwrNoqAeWvXUfV_ciCHni7uW3sIVUSiBVwxk1UXPPGyw4J2y7lh1EJkcWB4LKxJSZH6ddCo-4zpO3ZLZuWdvqx8P07i4s3aoWI8Z059F4kjcVXmU8Ac0bPalFp5ZtxId7BUmiGjE/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　以上で、今回は終了です。列挙型についてはもっと応用が効きそうな気がしますが、まだまだ実力不足でアイデアが…。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=114822.10000701&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;サンワダイレクト リングマウス&quot; border=&quot;0&quot; src=&quot;http://direct.sanwa.co.jp/linkshare/400-MA031_120926_B1.jpg&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=114822.10000701&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/aspnetmvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdX7YjQJ8TN6SeOO3B6Xc5xITHpeVLv4hRVgGL4PZcjr7RcoTfm1VBW3K8ucTHLxPaMTLS0eI1ytr8f-D8quzpKwGsoP7IExIaEd306UVujbc7lDuH4v7MWaUzY3u_WnbDcLXZbs1dOE/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-3855001980053330681</guid><pubDate>Wed, 26 Sep 2012 00:28:00 +0000</pubDate><atom:updated>2012-09-26T09:28:48.252+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】MVC4で何か作ってみる　その6（最終回）【MVC】</title><description>　&lt;a href=&quot;http://lightstaffblog.blogspot.jp/2012/09/aspnetmvc45mvc.html&quot;&gt;前回&lt;/a&gt;の続きです。&lt;br /&gt;
&lt;br /&gt;
　前回はjqueryのDataTablesプラグインで簡単に並べ替えとフィルターを実装することができました。今回はリストをドラッグアンドドロップで並べ替えしてみたいと思います。&lt;br /&gt;
&lt;br /&gt;
　いやぁー、ぶっちゃけ今回が一番苦労しました。ドラッグアンドドロップで並べ替えたまでは良かったんですが、その後のデータベースへの保存にかなり手こずりました。正直、諦めようかと思ったくらいでしたが、何とか出来てよかったです。&lt;br /&gt;
&lt;br /&gt;
　では早速、最初のモデル作成とコントローラー作成は今まで同じなのでちゃちゃっとやっちゃいます。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;社員順序モデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class EmployeeSort
{
 
    /// &amp;lt;summary&amp;gt;
    /// 社員ID
    /// &amp;lt;/summary&amp;gt;
    public int Id { get; set; }
 
    /// &amp;lt;summary&amp;gt;
    /// ソート順
    /// &amp;lt;/summary&amp;gt;
    public int SortNumber { get; set; }
 
    /// &amp;lt;summary&amp;gt;
    /// 社員名
    /// &amp;lt;/summary&amp;gt;
    public string EmployeeName { get; set; }
 
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Indexメソッド（コントローラー）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Index()
{
    var resultList = new List&amp;lt;EmployeeSort&amp;gt;();
 
    using (var context = new MvcTestContext())
    {
        var items = from p in context.Employees
                    orderby p.SortNumber
                    select p;
 
        foreach (var item in items)
        {
            resultList.Add(new EmployeeSort
                {
                    Id= item.EmployeeId,
                    SortNumber = (int)item.SortNumber,
                    EmployeeName = item.EmployeeName
                });
        }
    }
 
    return View(resultList);
}&lt;/pre&gt;
&lt;br /&gt;
　ここまでは特に問題ないでしょう。次にビューですが、今回はリスト上でのドラッグアンドドロップで並べ替えを実現するためにjqueryUIの「Sortableプラグイン」を利用します。細かな使い方は&lt;a href=&quot;http://jqueryui.com/demos/sortable/&quot;&gt;こちら&lt;/a&gt;を見てもらうとして、ビューで使用する準備をしましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Sortableプラグイン使用準備（ビューに追加）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;script src=&quot;~/Scripts/jquery-ui-1.8.23.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link href=&quot;~/Content/themes/smoothness/jquery-ui-1.8.23.custom.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;
 
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    $(function () {
        $(&#39;#sortable&#39;).sortable();
 
    });
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　ついでだったんでthemeも突っ込んどきました。これで&amp;lt;li&amp;gt;タグをドラッグアンドドロップで並べ替えできます。後は並べ替えた後、どう保存するかってとこなんですが、とりあえず単純に保存ボタンを押したら並べ替えた順に社員テーブルのIdを受け取ってテーブルを更新しちゃえばよいかと考えました。というわけで一端ビューは置いといて、Post時のIndexメソッドです。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Post時のIndexメソッド&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;[HttpPost]
public ActionResult Index(int[] id)
{
    using (var context = new MvcTestContext())
    {
        for (var i = 0; i &amp;lt; id.Length; i++)
        {
            var overlap = context.Employees.Find(id[i]);
 
            if (overlap != null)
            {
                overlap.SortNumber = i + 1;
            }
        }
 
        context.SaveChanges();
 
        return RedirectToAction(&quot;Index&quot;);
    }
}&lt;/pre&gt;
&lt;br /&gt;
　コードはいたってシンプルです。これで行けるはず。…とこの時点では余裕で考えてて、何気なしにビューの続きも作成しました。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ビュー全景&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@model IEnumerable&amp;lt;MVCTestProject.Models.EmployeeSort&amp;gt;
 
@{
    ViewBag.Title = &quot;Sort&quot;;
    Layout = &quot;~/Views/Shared/_LayoutPage.cshtml&quot;;
}
 
&amp;lt;script src=&quot;~/Scripts/jquery-ui-1.8.23.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link href=&quot;~/Content/themes/smoothness/jquery-ui-1.8.23.custom.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;
 
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    $(function () {
        $(&#39;#sortable&#39;).sortable();
 
    });
&amp;lt;/script&amp;gt;
 
&amp;lt;h2&amp;gt;並べ替え&amp;lt;/h2&amp;gt;
 
&amp;lt;ul id=&quot;sortable&quot;&amp;gt;
@foreach (var item in Model)
{
    &amp;lt;li class=&quot;ui-state-default&quot; style=&quot;padding: 5px; width: 200px&quot;&amp;gt;
        @Html.HiddenFor(model =&amp;gt; item.Id)
        @Html.DisplayFor(model =&amp;gt; item.SortNumber)&amp;amp;nbsp;:&amp;amp;nbsp;@Html.DisplayFor(model=&amp;gt;item.EmployeeName)
    &amp;lt;/li&amp;gt;
}
&amp;lt;/ul&amp;gt;
 
@using (Html.BeginForm()) {
        &amp;lt;input type=&quot;submit&quot; value=&quot;保存&quot; /&amp;gt;
}&lt;/pre&gt;
&lt;br /&gt;
　見ての通りモデルをリスト化し、最後の&amp;lt;input&amp;gt;タグでPostが発生するようにしています。これで「おぉー、出来た出来た」と早速、実行してみました。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果（並び替え）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVZiTndhw3S694O6ymJBGqNVJcnxGJ9Q161z9O009VoAJBoK10ebP1979UURoVwFWJYdYoKe1PvMVE70rCOQZaldg9g4S9e0S9gnmJF9Hwp6_PzWkxlBJOJjISIuoH6gYx0b7DINh5nEk/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;512&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiep7Epufb0IZKD716BvbsPeJlry9_zesdHlenBaJ1CjwF4H12GbwVuGgI4Xyvo-Wp7Vh7qBYiQlGkWsZmTcASnDZV8woxrSi3iVeYJUmk9pNagzrQDzgCR-vSqowzEWJzoAyLLIORC2A/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　ちょっと地味ですがプラグインは正常に動作し、ドラッグアンドドロップで並べ替えが効いています。次は保存ボタンをクリックしてみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果（保存）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDoSRGt2wkfKDNJ51aBhk_j57RSAFNWiBfi7ewCWYck4BBtxhjBVyx1YhhMzV7sOwgbLuvSB7ZojxT8NjrVZFsjj7Uv0p3sMRgvoE7zWgwU02-YKA0XLnDSpgeL3BFdDfUyTOfEEVsAIk/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;399&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPXu1_VsDdIK7wqmseVo4jzVlBSVtJrsonJDRYSLAazf7f8d16Y0M6Wn0P4Ikjj3APhRCXz-FcNbRyunvsHGoZ4T1TAzKZOPqZRvELZGl4wFmoo1BAaV_cE4mty1M6Lbpc6VeXF_ia44U/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　はい、こけました。お久しぶりの「NullReferenceException」さんです。引数の「id」がNullだとおっしゃってます。どうやらビューからコントローラーに引数が渡ってない模様。…ここから長い旅路が始まりました。&lt;br /&gt;
&lt;br /&gt;
　何故でしょう？「配列は渡せません」なんてことはないはずなんですが…。基本的にMVCではコントローラに引数を渡す際に、自動的に引数と同名のデータを収集・変換してくれてるはずです。それが渡ってないってことは収集されてないのか？ってな具合に試行錯誤しました。まぁ、1から試したこと書いてたらキリが無いので、途中経過はすっとばしますが、1つ目の間違いは「Html.BeginForm()」の位置でした。この辺、今までPHPとか全然構ってない人間なのでピンときてませんでしたが、対象となるデータが&amp;lt;form&amp;gt;タグに入ってなかったら送れないみたいです。ってこう書くと当たり前じゃねーかって気もしますね…。では修正です。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ビューを修正（部分抜粋）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@using (Html.BeginForm()) {
&amp;lt;ul id=&quot;sortable&quot;&amp;gt;
@foreach (var item in Model)
{
    &amp;lt;li class=&quot;ui-state-default&quot; style=&quot;padding: 5px; width: 200px&quot;&amp;gt;
        @Html.HiddenFor(model =&amp;gt; item.Id)
        @Html.DisplayFor(model =&amp;gt; item.SortNumber)&amp;amp;nbsp;:&amp;amp;nbsp;@Html.DisplayFor(model=&amp;gt;item.EmployeeName)
    &amp;lt;/li&amp;gt;
}
&amp;lt;/ul&amp;gt;
 
    &amp;lt;input type=&quot;submit&quot; value=&quot;保存&quot; /&amp;gt;
}&lt;/pre&gt;
&lt;br /&gt;
　「Html.BigenForm()」を&amp;lt;ul&amp;gt;タグの前に持ってきました。これでどうだって感じで実行してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7XKHWK8OjKRyJzVPcgUPqgFKcICvfH1B2xFzFwuNBPUKlUfXCGlVV_oLoSCAwRxX1G781kPK29J5w0Utuus_E81tM5KcFnfg25S0OvbKbTAqJPdGfEYwEcKOSLeRUUz1n7DZn0GzaqbY/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;399&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoJh3eMrZSMV9AJGBnBED61JiMSJ5nls4TJTJfvuEoYX3nbMHMfZlBcBVCJvzqk0MUElC41147kCsFyJxxuWA5xKt4owXO2VvlDhrUH6TEen65i2FTIdUb-qb2dj2L4Yv8P1hKMp64tlY/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　…駄目でした。でも「Html.BeginForm()」位置の修正に関しては間違ってないはずなのでこのままにしときます。それにしても何で「id」が収集されんのだろうか…とPage Inspectorの&amp;lt;li&amp;gt;タグをじっくり見直してみました。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Page Inspector（部分抜粋）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;li class=&quot;ui-state-default&quot; style=&quot;padding: 5px; width: 200px;&quot;&amp;gt;
&amp;lt;input name=&quot;item.Id&quot; id=&quot;item_Id&quot; type=&quot;hidden&quot; data-val-required=&quot;Id フィールドが必要です。&quot; data-val-number=&quot;フィールド Id には数字を指定してください。&quot; data-val=&quot;true&quot; value=&quot;83&quot;&amp;gt;&amp;lt;/input&amp;gt;
&amp;lt;/input&amp;gt;
        1 : 0子
&amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　「！！」っと、ここでようやく気がつきました。…今まで自分は何を見てたんでしょう。&amp;lt;input&amp;gt;タグのname属性にご注目。「name=”item.Id”」となってるんですよ。上にも書きましたがMVCはコントローラーの引数名でデータを収集するってことは「item.Id ≠ id」ってなわけで…。自分、name属性なんて指定せんでも勝手にやってくれるだろうと思ってたんです（ビュー側のモデルがIEnumerableやIListでなく単体の場合はそのままでOKっぽいです）…。これに気がつくのに数時間…。&lt;br /&gt;
&lt;br /&gt;
　何はともあれ原因っぽいのは分かったんで、ビューをまたもや修正します。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ビューの再修正（部分抜粋）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@using (Html.BeginForm()) {
&amp;lt;ul id=&quot;sortable&quot;&amp;gt;
@foreach (var item in Model)
{
    &amp;lt;li class=&quot;ui-state-default&quot; style=&quot;padding: 5px; width: 200px&quot;&amp;gt;
        @Html.Hidden(&quot;id&quot;, item.Id)
        @Html.DisplayFor(model =&amp;gt; item.SortNumber)&amp;amp;nbsp;:&amp;amp;nbsp;@Html.DisplayFor(model=&amp;gt;item.EmployeeName)
    &amp;lt;/li&amp;gt;
}
&amp;lt;/ul&amp;gt;
 
    &amp;lt;input type=&quot;submit&quot; value=&quot;保存&quot; /&amp;gt;
}&lt;/pre&gt;
&lt;br /&gt;
　ちょっと違いが分かりにくいですが、「@Html.HiddenFor」から「@Html.Hidden」に変更し、「id」という名前をつけてます。最初はname属性の付け方が分からなくてまたもや時間を喰いました。「@Html.HIddenFor」の方、MSDN(&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/ee703468(VS.98).aspx&quot;&gt;InputExtensions.HiddenFor(TModel, TProperty) メソッド (HtmlHelper(TModel), Expression(Func(TModel, TProperty)), IDictionary(String, Object)) (System.Web.Mvc.Html)&lt;/a&gt;)にはHtml属性を定義できるとありますが、自分はどうしてもname属性をつけることができませんでした（他の属性はできました）。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVjaUy-d4541ecU07UOCB7rz6VfPQGZA5NyaLhETCD9twkyhkmT1E5JxrKRp_WRl4XPp0iMMeOAtaKT8E2KHVf_C5yHr-C6WAKY57CKOCncoVE_MTQXriqI5CKjcW-u_unaan96eKIDrw/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;512&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijx0ojsTybUkxI3U1mr0ZdNbFL-rhQ7LmqQLfoCg7aFCgWlKRuvJsTjyNIBHaLQ2rMYNuK3-jxcf8OBtE8Qb4kDFmDZXt1Mw1x1CrZmokL91d0aBL8vopvKHD7GnAzJXA65BkfGcmTlC8/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　ちょっと分かりにくいですが、並べ替えを保存に成功した後です。結果自体は地味でしたがようやくドラッグアンドドロップで並べ替えを実装することができました。…わりとまじめにしんどかったです。&lt;br /&gt;
&lt;br /&gt;
　今回で「MVC4で何か作ってみる」は終了です。作ってみた感想としてはやっぱりまだまだ関係資料が少ないなぁと感じました。MSDNもまだほとんどがMVC3のヘルプを見ろって感じです（ぶっちゃけ見ても分かりづらいですが）。それでも個人的にはRazorの方がASPXより好みだし、jqueryとの連携もやっぱり面白いです。今回は見た目の方はやっつけで済ましましたが、もっとリッチなインターフェースを作成できそうな気がします（jqueryの勉強も必要ですが…）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;br /&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=39250.10000701&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;デル株式会社&quot; border=&quot;0&quot; src=&quot;http://i.dell.com/images/jp/banners/banners_l/dell_con_728x90_2.gif&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=39250.10000701&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/aspnetmvc46mvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiep7Epufb0IZKD716BvbsPeJlry9_zesdHlenBaJ1CjwF4H12GbwVuGgI4Xyvo-Wp7Vh7qBYiQlGkWsZmTcASnDZV8woxrSi3iVeYJUmk9pNagzrQDzgCR-vSqowzEWJzoAyLLIORC2A/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-8745666324777427157</guid><pubDate>Tue, 25 Sep 2012 00:07:00 +0000</pubDate><atom:updated>2012-09-25T09:07:39.463+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【Asp.Net】MVC4で何か作ってみる　その5【MVC】</title><description>　&lt;a href=&quot;http://lightstaffblog.blogspot.jp/2012/09/aspnetmvc44mvc.html&quot;&gt;前回&lt;/a&gt;の続きです。&lt;br /&gt;
&lt;br /&gt;
　前回は追加・更新・削除とメインとなる機能を作成しました。今回からは見た目の部分をやっていこうかと思います。まずは今後jqueryやcssを使うにあたってレイアウトページがあった方が定義をまとめたりしやすそうなのでレイアウトページを作成します。&lt;br /&gt;
&lt;br /&gt;
　プロジェクトにレイアウトページを追加します。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;レイアウトページの追加&lt;/strong&gt;&lt;br /&gt;
　&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMVct2rtoYtGs3za9Wo3MQZ1B8hyphenhyphenu93dMxbGk4EDHHP37lPbheyxUPXLz28iM9jigKnIDdz6TIIOBgFRQC7NeFbMikH2g2qbFIBaSzmH5SUxlROpcAne1mukoBztgk3SRQUnQElnfg3SA/s1600-h/2012092301%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;2012092301&quot; border=&quot;0&quot; height=&quot;419&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg83GCP5Z0SiKE0DGwTs3lyDGXwmWL1y_WRzlTE9L6qiuWyJ5kYXZUPEeP50U2P33RmC7u7BcSC7gTwF0v_Nh9_gkS0sTBbDQJ9vR1jErVqWgVowpEmLSYVQQvYyudJiP4rTnzkGhiHiBg/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012092301&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　この名前の_（アンダーバー）って何かルール的なもんがあるんでしょうか？とりあえず試しにレイアウトにヘッダーとフッターを設け、ついでにCSSも適用してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;レイアウト&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
 
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&amp;gt;
    &amp;lt;link href=&quot;~/Content/css/default.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
    &amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;header id=&quot;header&quot;&amp;gt;
        &amp;lt;h1&amp;gt;MVCTestProject&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;div id=&quot;main&quot;&amp;gt;
        @RenderBody()
    &amp;lt;/div&amp;gt;
    &amp;lt;footer id=&quot;footer&quot;&amp;gt;
        &amp;lt;address&amp;gt;
            これはMVCTestProjectです
        &amp;lt;/address&amp;gt;
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;default.css&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: css&quot;&gt;#header h1 {
    text-align:center;
    background-color: #333;
    color: #FFF;
}

#footer address {
    text-align:center;
    background-color: #333;
    color: #FFF;
}

#main h2 {
    color: #00F;
}&lt;/pre&gt;
&lt;br /&gt;
　次にHomeのIndexビューにレイアウト適用してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Indexビュー（Home）&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;@{
    ViewBag.Title = &quot;Index&quot;;
    
    &amp;lt;!-- レイアウトの適用　下記を追加 --&amp;gt;
    Layout = &quot;~/Views/Shared/_LayoutPage.cshtml&quot;;
}
 
&amp;lt;h2&amp;gt;Index&amp;lt;/h2&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxIUPwwFlaPuAPJ39WW7vVSm7y1dfrtDpXjYBiQQoYDE8ySwGg29axFIPm7V2S91gg6XJpAJJCLQMJ-PmczO7lFJtA4oe6uBwpbeocTF98MGSLmIy-N0Ywo-srSANu7ehTm-To8P2sle0/s1600-h/2012092302%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;2012092302&quot; border=&quot;0&quot; height=&quot;434&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqSkLL53SSlAlUYuUSKI_w773CsdfuHZKLqfhs8OEJPSgZhmoN-5h2YuYdG6mINv7zV3cfQTMJlmXn80_8GEOUmJrAoemDKOwzH2aBXM6lOxt52GWxlEpGuo_HVh9BMUhOQkK7jMOHLQk/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012092302&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　レイアウト、CSSともに適用されてますね。それにしてもVS2012の「Page Inspector」は本当に便利です。結果やデザイン確認するのにいちいちブラウザ立ち上げてページ移動してってのが軽減されるのは大きいです。&lt;br /&gt;
&lt;br /&gt;
　個人的に多少は満足出来たので次はいよいよ課題（&lt;a href=&quot;http://lightstaffblog.blogspot.jp/2012/09/aspnetmvc4-1mvc.html&quot;&gt;その1&lt;/a&gt;を参照）にあげてたjqueryでテーブルをあれこれにチャレンジしてみます。まずはレイアウトからjqueryを呼び出せるようにします。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;レイアウト&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
 
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&amp;gt;
    &amp;lt;link href=&quot;~/Content/css/default.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
    
    &amp;lt;!-- jqueryへの参照を追加 --&amp;gt;
    &amp;lt;script src=&quot;~/Scripts/jquery-1.8.1.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
    
    &amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;header id=&quot;header&quot;&amp;gt;
        &amp;lt;h1&amp;gt;MVCTestProject&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;div id=&quot;main&quot;&amp;gt;
        @RenderBody()
    &amp;lt;/div&amp;gt;
    &amp;lt;footer id=&quot;footer&quot;&amp;gt;
        &amp;lt;address&amp;gt;
            これはMVCTestProjectです
        &amp;lt;/address&amp;gt;
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
　次はテーブル操作系のプラグインに頼ろうかな…といろいろ探してみたんですが、すごくちょうどいいのがありました。「&lt;a href=&quot;http://datatables.net/&quot;&gt;DataTables (table plug-in for jQuery)&lt;/a&gt;」です。何か見た感じこれ1つでほとんど解決しちゃいそうです。&lt;br /&gt;
&lt;br /&gt;
　公式からzipをダウンロードし、展開したフォルダ内で必要そうなのだけ抜き出して社員リストのIndexビューにスクリプトとともに設置します。抜き出したファイルは「jquery.dataTables.min.js」「demo_table_jui.css」です。よく分かんなかったり、抜き出すのが面倒な方はmediaというフォルダをまるっと持ってくればOKです。あと、jqueryUIとも連携可能のでjqueryUIのテーマも持ってきました。スクリプトではパラメータの部分で更新列と削除列の検索と並べ替えを禁止してます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Indexビュー（EmployeeList)&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@model IEnumerable&amp;lt;MVCTestProject.Models.EmployeeList&amp;gt;
 
@{
    ViewBag.Title = &quot;社員リスト&quot;;
    Layout = &quot;~/Views/Shared/_LayoutPage.cshtml&quot;;
}
 
&amp;lt;script src=&quot;~/Scripts/jquery.dataTables.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link href=&quot;~/Content/css/demo_table_jui.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;
&amp;lt;link href=&quot;~/Content/themes/smoothness/jquery-ui-1.8.23.custom.css&quot; rel=&quot;stylesheet&quot; /&amp;gt;
 
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    $(function () {
        $(&#39;#employeelist&#39;).dataTable({
            &quot;bJQueryUI&quot;: true,
            &quot;sPaginationType&quot;: &quot;full_numbers&quot;,
            &quot;aoColumnDefs&quot;: [
                { &quot;bSearchable&quot;: false, &quot;bSortable&quot;: false, &quot;aTargets&quot;: [2] },
                { &quot;bSearchable&quot;: false, &quot;bSortable&quot;: false, &quot;aTargets&quot;: [3] }
            ]
        });
    });
&amp;lt;/script&amp;gt;
 
&amp;lt;h2&amp;gt;社員リスト&amp;lt;/h2&amp;gt;
 
&amp;lt;div&amp;gt;
    @Html.ActionLink(&quot;追加&quot;, &quot;Update&quot;, -1)
&amp;lt;/div&amp;gt;
 
&amp;lt;table id=&quot;employeelist&quot; class=&quot;display&quot;&amp;gt;
    &amp;lt;thead&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;th&amp;gt;
                社員名         
            &amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;
                配属先
            &amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;
                更新
            &amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;
                削除
            &amp;lt;/th&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/thead&amp;gt;
    &amp;lt;tbody&amp;gt;
@foreach (var item in Model)
{
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;
                @Html.DisplayFor(modelitem =&amp;gt; item.EmployeeName)
            &amp;lt;/td&amp;gt;
            &amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;
                @Html.DisplayFor(modelitem =&amp;gt; item.AssignName)
            &amp;lt;/td&amp;gt;
            &amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;
                @Html.ActionLink(&quot;更新&quot;, &quot;Update&quot;, new { id = item.Id })
            &amp;lt;/td&amp;gt;
            &amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;
                @Html.ActionLink(&quot;削除&quot;, &quot;Delete&quot;, new { id = item.Id })
            &amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;       
}
    &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　テーブルに&amp;lt;thead&amp;gt;タグと&amp;lt;tbody&amp;gt;タグも追加しています。どうやらこれがないとプラグインが動作しないみたいです。他のプラグインでも動かないケースがあるので覚えておいた方が良さそうです。これで準備OK。さっそく実行してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-6kA6FxiByblNuZi_qFA7-qUrzI01b5KJuXgQhwg9nmD_S62itIIj21WP6qUJt0CtaxFf-sIrGeMWACg2kjsqXgiCWPzKn2gZH9RGE2h_DPxGdJv4G2ksKMZ0Xbbl3fssF0qqyEaKJuE/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;616&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiALe6N5pJ8OBEr9O80vO_Y89mcj6X5-GXZ5EvrzE_vNUo4htfrAJJpV0cMNKyMR8ZsjYXH-SWqdmZAbo6EYU4JYG5AuXb1jLDcPgrbcgGt01JwsTFNWDp67-YSckwgYfeE2GQfYvwGT9k/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　おぉー、中々スマートになったじゃないですか？ちょっと英語の部分を日本語に変えたい気もしますが、それはまた今度で…。&lt;br /&gt;
&lt;br /&gt;
　今回はこれまで。次回はドラッグアンドドロップで並べ替え編です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=252926.489&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;HP Directplus オンラインストア&quot; border=&quot;0&quot; src=&quot;http://h50146.www5.hp.com/directplus/aff_banner/bnr_business/desktops/2012/09/0903/468x60.gif&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=252926.489&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/aspnetmvc45mvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg83GCP5Z0SiKE0DGwTs3lyDGXwmWL1y_WRzlTE9L6qiuWyJ5kYXZUPEeP50U2P33RmC7u7BcSC7gTwF0v_Nh9_gkS0sTBbDQJ9vR1jErVqWgVowpEmLSYVQQvYyudJiP4rTnzkGhiHiBg/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-7878447049030167893</guid><pubDate>Sat, 22 Sep 2012 02:08:00 +0000</pubDate><atom:updated>2012-10-17T11:07:16.710+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】MVC4で何か作ってみる　その4【MVC】</title><description>　&lt;a href=&quot;http://lightstaffblog.blogspot.jp/2012/09/aspnetmvc43mvc.html&quot;&gt;前回&lt;/a&gt;の続きです。&lt;br /&gt;
&lt;br /&gt;
　前回は自作の社員リストモデル（EmployeeList）をビューで表示しました。今回は表示したデータを利用し、社員テーブルの追加・更新・削除の機能を実装してみましょう。&lt;br /&gt;
&lt;br /&gt;
　まずは面倒な方からいきます。追加・更新です。これらは別々に作っても良いのですがページ自体が同じイメージになるので一緒にしちゃいます。処理の流れとしてはIndexビューのActionLinkからIdを受け取り、Idが「-1」等の存在しない値だったら新規用を、それ以外なら社員テーブルからデータを抽出して更新用を表示、保存時は既存Idだったら更新、なければ新規として扱うって感じでどうでしょう？&lt;br /&gt;
&lt;br /&gt;
　あとせっかくなんで配属先IDの入力はドロップダウンリストにしてみようかと思います。…なんて簡単に考えてたんですが、実際やってみるとちょっとモデルをよく考えないといけなそうです。MVCでないASP.Net等だったら別にドロップダウンリストのソースだけ配属先テーブルから取ってきてバインドなりすりゃすんだわけなんですが、MVCはModelViewControllerなわけでモデルに無いものは扱えませんよっていうか扱っちゃいけませんよってのが基本ですよね。当然、配属先テーブルは社員テーブルには無いわけです。なので追加・更新用に新たに配属先テーブルを持つモデルを作成します。&lt;br /&gt;
&lt;br /&gt;
　追記：別の方法もありました（&lt;a href=&quot;http://lightstaffblog.blogspot.jp/2012/10/aspnetviewbagdropdownlistmvc.html&quot;&gt;ViewBagを追加ってDropDownListを作ってみる&lt;/a&gt;）&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;社員編集用モデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class EmployeeUpdate
{
 
    /// &amp;lt;summary&amp;gt;
    /// 社員ID
    /// &amp;lt;/summary&amp;gt;
    public int Id { get; set; }
 
    /// &amp;lt;summary&amp;gt;
    /// 社員名
    /// &amp;lt;/summary&amp;gt;
    public string EmployeeName { get; set; }
 
    /// &amp;lt;summary&amp;gt;
    /// 配属先ID
    /// &amp;lt;/summary&amp;gt;
    public int AssignId { get; set; }
 
    /// &amp;lt;summary&amp;gt;
    /// 配属先テーブルリスト
    /// &amp;lt;/summary&amp;gt;
    public List&amp;lt;Assign&amp;gt; Assigns { get; set; }
 
}&lt;/pre&gt;
&lt;br /&gt;
　モデルは見ての通り、社員テーブルのデータと配属先テーブルのリストで作られています。それではこれを使ってコントローラーに表示用メソッドを追加します。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Updateメソッド&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Update(int id = -1)
{
    using (var context = new MvcTestContext())
    {
        var overlap = context.Employees.Find(id);
 
        if (overlap == null)
        {
            var result = new EmployeeUpdate
                {
                    Assigns = context.Assigns.ToList()
                };
 
            return View(result);
        }
        else
        {
            var result = new EmployeeUpdate
                {
                    Id = overlap.EmployeeId,
                    EmployeeName = overlap.EmployeeName,
                    AssignId = overlap.AssignId,
                    Assigns = context.Assigns.ToList()
                };
 
            return View(result);
        }
    }
}&lt;/pre&gt;
&lt;br /&gt;
　いまいちスマートじゃないけど中身はシンプルなメソッドなので解説なしで、一端これを元にビューを作成しますか。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Updateビュー&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@model MVCTestProject.Models.EmployeeUpdate
 
@{
    ViewBag.Title = &quot;Update&quot;;
}
 
@if (Model.Id != 0)
{
    &amp;lt;h2&amp;gt;更新&amp;lt;/h2&amp;gt;       
}else
{
    &amp;lt;h2&amp;gt;追加&amp;lt;/h2&amp;gt;
}
 
@using (Html.BeginForm())
{
    &amp;lt;!-- IdはPost時に利用する必要があるので隠しときます --&amp;gt;
    @Html.HiddenFor(model =&amp;gt; model.Id)
 
    &amp;lt;div class=&quot;editor-label&quot;&amp;gt;社員名&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
        @Html.EditorFor(model =&amp;gt; model.EmployeeName)
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;editor-label&quot;&amp;gt;配属先&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;editor-field&quot;&amp;gt;
        @Html.DropDownListFor(model =&amp;gt; model.AssignId, new SelectList(Model.Assigns,&quot;AssignId&quot;, &quot;AssignName&quot;))
    &amp;lt;/div&amp;gt;
        
    &amp;lt;p&amp;gt;
        &amp;lt;input type=&quot;submit&quot; value=&quot;保存&quot; /&amp;gt;
    &amp;lt;/p&amp;gt;
}
 
&amp;lt;div&amp;gt;
    @Html.ActionLink(&quot;戻る&quot;, &quot;Index&quot;)
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　ドロップダウンリストの書き方、資料がなさ過ぎて苦労しました。MSDN（&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/ee703462(v=vs.98).aspx&quot;&gt;SelectExtensions.DropDownListFor(TModel, TProperty) メソッド (HtmlHelper(TModel), Expression(Func(TModel, TProperty)), IEnumerable(SelectListItem)) (System.Web.Mvc.Html)&lt;/a&gt;）分かりにくいです。「@Html.DropDownListFor(モデルの値, 使用するリスト(値フィールド, 表示フィールド))」って感じです。これで保存ボタンをクリックするとPostが発生するようになるので次はコントローラーに戻り、Post時のメソッドを書きます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Post時のUpdateメソッド&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;[HttpPost]
public ActionResult Update(EmployeeUpdate employeeUpdate)
{
    using (var context = new MvcTestContext())
    {
        var overlap = context.Employees.Find(employeeUpdate.Id);
 
        if (overlap == null)
        {
            context.Employees.Add(new Employee
                {
                    EmployeeName = employeeUpdate.EmployeeName,
                    AssignId = employeeUpdate.AssignId,
                    SortNumber = (from p in context.Employees
                                    select p.SortNumber).Max() + 1
                });
        }
        else
        {
            overlap.EmployeeName = employeeUpdate.EmployeeName;
            overlap.AssignId = employeeUpdate.AssignId;
        }
 
        context.SaveChanges();
        return RedirectToAction(&quot;Index&quot;);
    }
}&lt;/pre&gt;
&lt;br /&gt;
　[HttpPost]を忘れないよう。これないとPost時に動いてくれません。あれPost時にモデルって渡したっけ？って感じですがどうやら自動的に渡してくれてる模様です。処理自体は最初に考えてたとおりに処理しています。IDの重複があれば更新、なければ追加です。んで最終的にIndexに移動します。深い意味はありませんがSortNumberフィールドは追加時は最大値を取るようにしてます。&lt;br /&gt;
&lt;br /&gt;
　以下、実行結果です。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;追加&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRbtEgmHBc09h1vLY0TctlG3fq6wrdh9q2W8iObtop7jxqyExt4W6mKLJXM5bPFGCu0C43jUprqz6rnAG94M4MaS-MGpYAMmkzwUS-qbpMt4JL2K_V_SqihLiWgVAdChZQYQmZVM-NWkY/s1600/2012092202.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;147&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRbtEgmHBc09h1vLY0TctlG3fq6wrdh9q2W8iObtop7jxqyExt4W6mKLJXM5bPFGCu0C43jUprqz6rnAG94M4MaS-MGpYAMmkzwUS-qbpMt4JL2K_V_SqihLiWgVAdChZQYQmZVM-NWkY/s400/2012092202.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;更新&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnlduwB7Vnco14TJ2zqM9M4mL7txuocFmTs1eEUKQ-bs_me4wUIJWRw00B16qF4wwWbaQeFqE9UQDceqZGS-W5VGmT8a1-heXtQDSq95uVb9j3BVRFlr8UmRuRENAjGtGn53XugnQRV5I/s1600/2012092201.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;147&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnlduwB7Vnco14TJ2zqM9M4mL7txuocFmTs1eEUKQ-bs_me4wUIJWRw00B16qF4wwWbaQeFqE9UQDceqZGS-W5VGmT8a1-heXtQDSq95uVb9j3BVRFlr8UmRuRENAjGtGn53XugnQRV5I/s400/2012092201.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
　追加時、更新時でURLのパラメータの違うのが分かりますね。さて追加・更新ができたので次は削除です。ちょっと疲れてきましたが一気にやってしまいましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;社員削除用モデル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class EmployeeDelete
{
 
    /// &amp;lt;summary&amp;gt;
    /// ID
    /// &amp;lt;/summary&amp;gt;
    public int Id { get; set; }
 
    /// &amp;lt;summary&amp;gt;
    /// 社員名
    /// &amp;lt;/summary&amp;gt;
    public string EmployeeName { get; set; }
 
    /// &amp;lt;summary&amp;gt;
    /// 配属先名
    /// &amp;lt;/summary&amp;gt;
    public string AssignName { get; set; }
 
}&lt;/pre&gt;
&lt;br /&gt;
　Indexで使ったEmployeeListモデルと内容が同じになっちゃいましたが一応使い分けが効くように別にモデルを作りました。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Deleteメソッド&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Delete(int id = -1)
{
    using (var context = new MvcTestContext())
    {
        var overlap = (from p in context.Employees
                        join g in context.Assigns
                        on p.AssignId equals g.AssignId into gg
                        from ggg in gg.DefaultIfEmpty()
                        where p.EmployeeId == id
                        select new
                        {
                            p.EmployeeId,
                            p.EmployeeName,
                            AssignName = (ggg != null ? ggg.AssignName : string.Empty)
                        }).FirstOrDefault();
 
        if (overlap == null)
        {
            return HttpNotFound();
        }
        else
        {
            var result = new EmployeeDelete
                {
                    Id = overlap.EmployeeId,
                    EmployeeName = overlap.EmployeeName,
                    AssignName = overlap.AssignName
                };
 
            return View(result);
        }
    }
}&lt;/pre&gt;
&lt;br /&gt;
　対象IDが見つからなかった場合、「HttpNotFund」を呼び出し、オブジェクトが見つからなかったぞと通知するようにしてます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Deleteメソッド（Post時）&lt;/strong&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;[HttpPost, ActionName(&quot;Delete&quot;)]
public ActionResult DeleteConfirmed(int id)
{
    using (var context = new MvcTestContext())
    {
        var overlap = context.Employees.Find(id);
        context.Employees.Remove(overlap);
        context.SaveChanges();
        return RedirectToAction(&quot;Index&quot;);
    }
}&lt;/pre&gt;
&lt;br /&gt;
　前述のDeleteメソッドとメソッド名とパラメータが被っちゃうので別名にし、ActionName属性でアクション（”Delete&quot;）を指定してます。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Deleteビュー&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@model MVCTestProject.Models.EmployeeDelete
 
@{
    ViewBag.Title = &quot;Delete&quot;;
}
 
&amp;lt;h2&amp;gt;このデータを削除してもよろしいですか？&amp;lt;/h2&amp;gt;
 
&amp;lt;fieldset&amp;gt;
    &amp;lt;legend&amp;gt;社員データ&amp;lt;/legend&amp;gt;
    &amp;lt;div class=&quot;display-label&quot;&amp;gt;社員名&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;display-field&quot;&amp;gt;
        @Html.DisplayFor(model =&amp;gt; model.EmployeeName)
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;display-label&quot;&amp;gt;配属先&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;display-field&quot;&amp;gt;
        @Html.DisplayFor(model =&amp;gt; model.AssignName)
    &amp;lt;/div&amp;gt;
&amp;lt;/fieldset&amp;gt;
@using (Html.BeginForm()) {
    &amp;lt;input type=&quot;submit&quot; value=&quot;Delete&quot; /&amp;gt;
    @Html.ActionLink(&quot;戻る&quot;, &quot;Index&quot;)
}
&lt;/pre&gt;
&lt;br /&gt;
　これは特に言うことも無いでしょう。次に実行結果です。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBK-0cHF9ILLEX-kE5PlWZ5n2rgw6HbyWARPPrJRRxgABW32GijniGB4NdB4LM4H9TYqq7Lth2kcskYJS5U7I9M6dyelcBfscpC76EGmfW16nH4tQ6r5a3F-bZEgdBw5qBzq6ANhUCEDs/s1600/2012092203.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;147&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBK-0cHF9ILLEX-kE5PlWZ5n2rgw6HbyWARPPrJRRxgABW32GijniGB4NdB4LM4H9TYqq7Lth2kcskYJS5U7I9M6dyelcBfscpC76EGmfW16nH4tQ6r5a3F-bZEgdBw5qBzq6ANhUCEDs/s400/2012092203.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
　あー、疲れた。とりあえずは思った通りにできたので今回はここまでにします。それにしても予想以上にシンプルな流れで作れるので素直にMVCに感動しました。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=178652.10000273&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;1616 / arita japan&quot; border=&quot;0&quot; src=&quot;http://www.cassina-ixc.jp/media/Affiliate_bannar/1616arita_japan468_60.jpg&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=178652.10000273&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/aspnetmvc44mvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRbtEgmHBc09h1vLY0TctlG3fq6wrdh9q2W8iObtop7jxqyExt4W6mKLJXM5bPFGCu0C43jUprqz6rnAG94M4MaS-MGpYAMmkzwUS-qbpMt4JL2K_V_SqihLiWgVAdChZQYQmZVM-NWkY/s72-c/2012092202.png" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-786960023850743874</guid><pubDate>Thu, 20 Sep 2012 23:15:00 +0000</pubDate><atom:updated>2012-09-21T08:15:48.358+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】MVC4で何か作ってみる　その3【MVC】</title><description>　&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/aspnetmvc42mvc.html&quot;&gt;前回&lt;/a&gt;の続きです。&lt;br /&gt;
&lt;br /&gt;
　前回はCodeFirstでデータベースを作成し、テンプレートを使ってEntityFrameworkと連動したページを作成しました。今回はテンプレートを使わず、社員テーブルと配属先テーブルを結合したモデルを表示し、それを元にデータを編集するページを作成してみたいと思います。&lt;br /&gt;
　&lt;br /&gt;
　まずはモデルを定義します。&lt;br /&gt;
&lt;strong&gt;社員リスト&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public class EmployeeList
{
 
    /// &amp;lt;summary&amp;gt;
    /// ID
    /// &amp;lt;/summary&amp;gt;
    public int Id { get; set; }
 
    /// &amp;lt;summary&amp;gt;
    /// 社員名
    /// &amp;lt;/summary&amp;gt;
    public string EmployeeName { get; set; }

　　/// &amp;lt;summary&amp;gt;
    /// 配属先名
    /// &amp;lt;/summary&amp;gt;
    public string AssignName { get; set; }

}&lt;/pre&gt;
&lt;br /&gt;
　次はコントローラーを作成します。モデルを指定しない空のコントローラーです。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;空のコントローラーの作成&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD3t_7vDprK8gF5z8kSHupa2aDp7MTpMVkdY2LF5TlLOS63bv5hjWULOmg82YYsixZGtak2pPWv-XqjAzHK5hsoOLOcETSaytXdWgvp3BKp4zn1BMh4oMSnIAnLp8dBStAQzhfwkUgWIw/s1600-h/2012092101%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;2012092101&quot; border=&quot;0&quot; height=&quot;311&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6GHem51vXB1dEP1lGc1Kn6QUDVtMCwOg852MeVEQpUdqVdaumYMX3jAzw-Qux3upvZ3KwixigYnjgUfM85Y6uPY1KhUvuyU6B4Sp6zmCG_XmIoiiONcFz1IxbBu-YzWYOnI6fnnIXq1g/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012092101&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　では早速、作成したクラスのIndexメソッドをいじくってみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Indexメソッド&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;public ActionResult Index()
{
    var resultList = new List&amp;lt;EmployeeList&amp;gt;();
            
    using(var context = new MvcTestContext())
    {
        var items = from p in context.Employees
                    join g in context.Assigns
                    on p.AssignId equals g.AssignId into gg 
                    from ggg in gg.DefaultIfEmpty()
                    orderby p.SortNumber ascending
                    select new
                    {
                        p.EmployeeId,
                        p.EmployeeName,
                        AssignName = (ggg != null ? ggg.AssignName:string.Empty)
                    };
        
        //どうでもいいけどParallel使うと順序が狂うよ！
　　　　foreach (var item in items)
        {
            resultList.Add(new EmployeeList
            {
                Id = item.EmployeeId,
                EmployeeName = item.EmployeeName,
                AssignName = item.AssignName
            });
        }
    }
 
    return View(resultList);
}&lt;/pre&gt;
&lt;br /&gt;
　コード自体は単純なので特に解説は不要でしょう。続けて、ビューも作ります。ビューもせっかくですから空のビューを作ります。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ビューの作成&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-PJe9HDR-val6e4njJBWu_gTmJjYC8Gbt8AJto_m3iyry5PtknbFFmWnZeRy4DBxytyT5shsmVF6IuTzz-BPBv6fwxOq64wgUh6vf6o4ly-PKwqWggNwyQxg2K2yMg4VQt52wM-Gz9zI/s1600-h/2012092102%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012092102&quot; border=&quot;0&quot; height=&quot;472&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_ywgBFtGd6mmZzqw0zgQI5LatCiYH8yaMKKhNGO1dRWBhoQpDhCgoJZOFocWgruIiV1hCAR3P7NydZvjDQ5M2XomHppaYMBWM06gbcIuvEKtd8Qppz5Qwj15OM8ZB7mHhKUTNLh3F6Qk/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012092102&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　ではRazorに挑戦します。挑戦とは言っても前回作成したEntityFrameworkと連動したテンプレートを見本にすれば特に難しいこともないです。モデルを宣言し、受けたデータをぶん回してデーブルで表示するだけです。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Index.cshtml&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@model IEnumerable&amp;lt;MVCTestProject.Models.EmployeeList&amp;gt;
 
@{
    ViewBag.Title = &quot;社員リスト&quot;;
}
 
&amp;lt;h2&amp;gt;社員リスト&amp;lt;/h2&amp;gt;
 
&amp;lt;table&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;th&amp;gt;
            社員名         
        &amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;
            配属先
        &amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
 
@foreach (var item in Model)
{
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.DisplayFor(modelitem =&amp;gt; item.EmployeeName)
        &amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.DisplayFor(modelitem =&amp;gt; item.AssignName)
        &amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;       
}
&amp;lt;/table&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
　ここで一端ブラウザで表示してみます。&lt;br /&gt;
&lt;br /&gt;
実行結果&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9opbgWtjjHhYx-1_swIeTkzcXpHyNcVcy10u2nUHX8pINM_d2y-Z2glr2k8DvJ-1_DxLbyRemanpzl-ABNpYyj17UyOI5wqXhXhUM2RQEeFzVP7QEs3G6imlToDKrFAorzE4m-E6V0dY/s1600-h/2012092103%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012092103&quot; border=&quot;0&quot; height=&quot;442&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKrGN_Po4CR0PPp1_BMMmYvRtqm1i1nGQFOdo_HzF6lH_HcG3GDD5WJ0KHp3o7qqCQrngqYUCeIgKMWASedsbKfcH9oqI92jmBUU748-pWGBGEZUDlPnAws-MSDT_hK-T11pDFYxd-rUk/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012092103&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　どうやら希望通りの結果が表示されてるみたいです（IDは表示する必要ないので省きました。）。&lt;br /&gt;
&lt;br /&gt;
　内容は簡単だったんですが、ちょっと長くなりすぎたのでこの辺で切ります。編集機能は次回にします。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=260508.37&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;ソフマップ・ドットコム&quot; border=&quot;0&quot; src=&quot;http://www.sofmap.com/ec/topics/linkshare/camera/468x60.jpg&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=260508.37&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/aspnetmvc43mvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6GHem51vXB1dEP1lGc1Kn6QUDVtMCwOg852MeVEQpUdqVdaumYMX3jAzw-Qux3upvZ3KwixigYnjgUfM85Y6uPY1KhUvuyU6B4Sp6zmCG_XmIoiiONcFz1IxbBu-YzWYOnI6fnnIXq1g/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-551764255964911746</guid><pubDate>Wed, 19 Sep 2012 23:45:00 +0000</pubDate><atom:updated>2012-09-20T08:45:43.449+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】MVC4で何か作ってみる　その2【MVC】</title><description>　&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/aspnetmvc4-1mvc.html&quot;&gt;前回&lt;/a&gt;の続き。&lt;br /&gt;
&lt;br /&gt;
　今回はCodeFirstでデータベースを準備します。さて早速ひとつ問題が…。MVC上のModelとEntityFramework上のModelを同一視しても良いものか？当然ながら連携面を考えた場合、同一のModelとして扱ってしまった方が楽なのは間違いなりませんし、チャートリアル等でもそのように扱われています。じゃあそうりゃいいじゃんって話なんですが、個人的にMVCとEntityFrameworkのどちらからしか使わない可能性のあるModelを作ることに抵抗があったりするわけで…。とりあえず今回はプロジェクトのModelsフォルダにDbフォルダを設け、EntityFrameworkのModelはそちらに書くことにします。&lt;br /&gt;
&lt;br /&gt;
　さっそくModelの定義です。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;社員テーブル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;using System.ComponentModel.DataAnnotations;
 
namespace MVCTestProject.Models.Db
{
    /// &amp;lt;summary&amp;gt;
    /// 社員テーブル
    /// &amp;lt;/summary&amp;gt;
    public class Employee
    {
 
        /// &amp;lt;summary&amp;gt;
        /// ID
        /// &amp;lt;/summary&amp;gt;
        public int EmployeeId { get; set; }
 
        /// &amp;lt;summary&amp;gt;
        /// 社員名
        /// &amp;lt;/summary&amp;gt;
        [MaxLength(50)]
        public string EmployeeName { get; set; }
 
        /// &amp;lt;summary&amp;gt;
        /// 配属先ID
        /// &amp;lt;/summary&amp;gt;
        public int AssignId { get; set; }
 
        /// &amp;lt;summary&amp;gt;
        /// ソート順
        /// &amp;lt;/summary&amp;gt;
        public decimal SortNumber { get; set; }
 
    }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;配属先テーブル&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;using System.ComponentModel.DataAnnotations;
 
namespace MVCTestProject.Models.Db
{
    /// &amp;lt;summary&amp;gt;
    /// 配属先テーブル
    /// &amp;lt;/summary&amp;gt;
    public class Assign
    {
 
        /// &amp;lt;summary&amp;gt;
        /// ID
        /// &amp;lt;/summary&amp;gt;
        public int AssignId { get; set; }
 
        /// &amp;lt;summary&amp;gt;
        /// 配属先名
        /// &amp;lt;/summary&amp;gt;
        [MaxLength(50)]
        public string AssignName { get; set; }
 
    }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;コンテキスト&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;using System.Data.Entity;
using MVCTestProject.Models.Db;
 
namespace MVCTestProject
{
    /// &amp;lt;summary&amp;gt;
    /// データベースコンテキスト
    /// &amp;lt;/summary&amp;gt;
    public class MvcTestContext : DbContext
    {
 
        /// &amp;lt;summary&amp;gt;
        /// MvcTestDbという名前でDｂを作成
        /// &amp;lt;/summary&amp;gt;
        public MvcTestContext()
            : base(&quot;MvcTestDb&quot;)
        { }
 
        public DbSet&amp;lt;Employee&amp;gt; Employees { get; set; }
 
        public DbSet&amp;lt;Assign&amp;gt; Assigns { get; set; }
 
    }
}&lt;/pre&gt;
&lt;br /&gt;
　データベースはとりあえずローカルに置くのでWeb.configは放置。変更が必要であればConnectionStringsタブなりEntityFrameworkタブなりに追記してください。&lt;br /&gt;
&lt;br /&gt;
　あと、テストデータを用意したいのでConfigurationクラスを追加します。分からなければ&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/08/migration_1317.html&quot;&gt;この辺&lt;/a&gt;を参照してください。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ConfigurationクラスのSeedメソッド&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;protected override void Seed(MVCTestProject.MvcTestContext context)
{
    var employeeList = new List&amp;lt;Employee&amp;gt;();
 
    Parallel.For(0, 101, (n) =&amp;gt;
        {
            employeeList.Add(new Employee
                {
                    EmployeeName = (n % 2 != 0 ? n + &quot;男&quot; : n + &quot;子&quot;),
                    AssignId = (n % 2 != 0 ? 1 : 2),
                    SortNumber = n
                });
        });
 
    var target = employeeList.ToArray();
    context.Employees.AddOrUpdate(target);
 
    context.Assigns.AddOrUpdate(
        new Assign
            {
                AssignName = &quot;A&quot;
            },
        new Assign
            {
                AssignName = &quot;B&quot;
            });
}&lt;/pre&gt;
&lt;br /&gt;
　Emloyee型のリストを作成した後、わざわざ変数に突っ込んでるのは実行時にAddOrUpdateメソッドに「非静的メソッドはターゲットがうんぬん」と叱られるからです。これで下準備が完成です。&lt;br /&gt;
&lt;br /&gt;
　今後、自力でビューを作っていくにあたってMVCがデータベースに対してどうゆう動作をするか知りたいと思います。なのでとりあえずコントローラーの作成時にEntityFrameworkと連携したテンプレートを選択してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;テンプレートやらモデル等を選択&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn7kSq_1nmWu31KhoDteqoD2_PuMZaRemImRrwyYlURibMHITZkEZUunfLJxG9wZBi_taXf5UTkMdIbnlmnwQxW-NtboUAQcQr3kDot8KoP4TqyU4o1WWkFka76soDq_HFaNA6TI-PyKY/s1600-h/2012092002%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012092002&quot; border=&quot;0&quot; height=&quot;311&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjJe2lAanrgXALGQxKTa2dUMoAuGkBldLyCdlTZsMHjMX4JuKULM_1SC6plyJuS-ng6YT-iFcYy73WuSyryKs8jgPZ_U2xNT1eljUXNAdVAxpCI07ss7m9QcHlaPKb2JIOMWegBVqVxLI/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012092002&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;作成されたコントローラー&lt;/strong&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCTestProject.Models.Db;
 
namespace MVCTestProject.Controllers
{
    public class EmployeeController : Controller
    {
        private MvcTestContext db = new MvcTestContext();
 
        //
        // GET: /Employee/
 
        public ActionResult Index()
        {
            return View(db.Employees.ToList());
        }
 
        //
        // GET: /Employee/Details/5
 
        public ActionResult Details(int id = 0)
        {
            Employee employee = db.Employees.Find(id);
            if (employee == null)
            {
                return HttpNotFound();
            }
            return View(employee);
        }
 
        //
        // GET: /Employee/Create
 
        public ActionResult Create()
        {
            return View();
        }
 
        //
        // POST: /Employee/Create
 
        [HttpPost]
        public ActionResult Create(Employee employee)
        {
            if (ModelState.IsValid)
            {
                db.Employees.Add(employee);
                db.SaveChanges();
                return RedirectToAction(&quot;Index&quot;);
            }
 
            return View(employee);
        }
 
        //
        // GET: /Employee/Edit/5
 
        public ActionResult Edit(int id = 0)
        {
            Employee employee = db.Employees.Find(id);
            if (employee == null)
            {
                return HttpNotFound();
            }
            return View(employee);
        }
 
        //
        // POST: /Employee/Edit/5
 
        [HttpPost]
        public ActionResult Edit(Employee employee)
        {
            if (ModelState.IsValid)
            {
                db.Entry(employee).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction(&quot;Index&quot;);
            }
            return View(employee);
        }
 
        //
        // GET: /Employee/Delete/5
 
        public ActionResult Delete(int id = 0)
        {
            Employee employee = db.Employees.Find(id);
            if (employee == null)
            {
                return HttpNotFound();
            }
            return View(employee);
        }
 
        //
        // POST: /Employee/Delete/5
 
        [HttpPost, ActionName(&quot;Delete&quot;)]
        public ActionResult DeleteConfirmed(int id)
        {
            Employee employee = db.Employees.Find(id);
            db.Employees.Remove(employee);
            db.SaveChanges();
            return RedirectToAction(&quot;Index&quot;);
        }
 
        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}&lt;/pre&gt;
&lt;br /&gt;
　あー、なんだか長くなっちゃいましたが、何となくはデータベースに対するアクセスの仕方が見えたのではないでしょうか？データベース→データ取得→ビューに渡すって単純な流れですね。&lt;br /&gt;
&lt;br /&gt;
　一応、ビュー側も載せておきます。Razorは慣れないと違和感ありまくりですね。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Index.cshtml&lt;/strong&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;@model IEnumerable&amp;lt;MVCTestProject.Models.Db.Employee&amp;gt;
 
@{
    ViewBag.Title = &amp;quot;Index&amp;quot;;
}
 
&amp;lt;h2&amp;gt;Index&amp;lt;/h2&amp;gt;
 
&amp;lt;p&amp;gt;
    @Html.ActionLink(&amp;quot;Create New&amp;quot;, &amp;quot;Create&amp;quot;)
&amp;lt;/p&amp;gt;
&amp;lt;table&amp;gt;
    &amp;lt;tr&amp;gt;
        &amp;lt;th&amp;gt;
            @Html.DisplayNameFor(model =&amp;gt; model.EmployeeName)
        &amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;
            @Html.DisplayNameFor(model =&amp;gt; model.AssignId)
        &amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;
            @Html.DisplayNameFor(model =&amp;gt; model.SortNumber)
        &amp;lt;/th&amp;gt;
        &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
 
@foreach (var item in Model) {
    &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.DisplayFor(modelItem =&amp;gt; item.EmployeeName)
        &amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.DisplayFor(modelItem =&amp;gt; item.AssignId)
        &amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.DisplayFor(modelItem =&amp;gt; item.SortNumber)
        &amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;
            @Html.ActionLink(&amp;quot;Edit&amp;quot;, &amp;quot;Edit&amp;quot;, new { id=item.EmployeeId }) |
            @Html.ActionLink(&amp;quot;Details&amp;quot;, &amp;quot;Details&amp;quot;, new { id=item.EmployeeId }) |
            @Html.ActionLink(&amp;quot;Delete&amp;quot;, &amp;quot;Delete&amp;quot;, new { id=item.EmployeeId })
        &amp;lt;/td&amp;gt;
    &amp;lt;/tr&amp;gt;
}
 
&amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;br /&gt;
　それでは今回はこの辺で…。次回は課題である結合したデータをビューに渡したり、それを利用して更新したりする予定です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://linksynergy.jrs5.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=252693.20&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;ビックカメラ.com&quot; border=&quot;0&quot; src=&quot;http://www.biccamera.com/linkshare/images/468x60/468x60_bdr.gif&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=252693.20&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;</description><link>http://lightstaffblog.blogspot.com/2012/09/aspnetmvc42mvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjJe2lAanrgXALGQxKTa2dUMoAuGkBldLyCdlTZsMHjMX4JuKULM_1SC6plyJuS-ng6YT-iFcYy73WuSyryKs8jgPZ_U2xNT1eljUXNAdVAxpCI07ss7m9QcHlaPKb2JIOMWegBVqVxLI/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-8977405359438938055</guid><pubDate>Wed, 19 Sep 2012 03:15:00 +0000</pubDate><atom:updated>2012-09-19T14:26:45.603+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">MVC</category><title>【ASP.Net】MVC4で何か作ってみる その1【MVC】</title><description>　さて、開発使用していた案件がMVCで作れるんじゃないかと思い始めた今日この頃。というかもうかなり本気でそっちで作ってやろうかと思い始めてるわけで…。&lt;br /&gt;
　とりあえずMVCって2の頃からまともに構ってないので試しに4で何か作ってみようかと思ったわけです。んな訳で条件をば…。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;前提条件&lt;/strong&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;テンプレートは使わず空のプロジェクトから始める。&lt;/li&gt;
&lt;li&gt;CodeFirstとの連携。ただしビューに表示するのはテーブルを結合したデータを使う。更新、削除はそのデータを利用し行う。要は直接的にテーブルを編集しないってこと。&lt;/li&gt;
&lt;li&gt;jqueryかjavascriptを利用してテーブルにフィルターとソート機能を設ける。&lt;/li&gt;
&lt;li&gt;jqueryを利用してリストをドラックアンドドロップで並べ替え、それをデータベースへ反映する。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
　なんか半分jqueryじゃんって感じもするけど、まぁこんな感じでやってきます。じゃぁ次はデータベース使うんでその定義。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;テーブル定義&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;社員テーブル&lt;/strong&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot; style=&quot;width: 500px;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: #333333; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; color: white;&quot;&gt;フィールド名&lt;/th&gt;
&lt;th style=&quot;background-color: #333333; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; color: white;&quot;&gt;型&lt;/th&gt;
&lt;th style=&quot;background-color: #333333; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; color: white;&quot;&gt;主キー&lt;/th&gt;
&lt;th style=&quot;background-color: #333333; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; color: white;&quot;&gt;外部キー&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot;&gt;EmployeeId&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot;&gt;EmployeeName&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;nvarchar(50)&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot;&gt;AssingId&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;○&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot;&gt;SortNumber&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;decimal&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;strong&gt;配属先テーブル&lt;/strong&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot; style=&quot;width: 500px;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: #333333; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; color: white;&quot;&gt;フィールド名&lt;/th&gt;
&lt;th style=&quot;background-color: #333333; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; color: white;&quot;&gt;型&lt;/th&gt;
&lt;th style=&quot;background-color: #333333; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; color: white;&quot;&gt;主キー&lt;/th&gt;
&lt;th style=&quot;background-color: #333333; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; color: white;&quot;&gt;外部キー&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot;&gt;AssignId&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;○&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot;&gt;AssignName&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;nvarchar(50)&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;border-bottom: #ccc 1px solid; border-left: #ccc 1px solid; border-right: #ccc 1px solid; border-top: #ccc 1px solid; text-align: center;&quot; text-align:=&quot;center;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
　社員テーブルには100行、配属先テーブルに3行くらいデータを準備する予定です。&lt;br /&gt;
　では早速プロジェクトを作成します。今回はせっかくですのでVisualStudioExpress2012forWebも試してみます。Expressって言ってますが機能比較を見てみるとWebに関してはこれで十分な気がする…。（&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/ms349441.aspx&quot;&gt;Visual Studio と Visual Studio Express 2012 for Web の比較&lt;/a&gt;）&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;新しいプロジェクトの作成&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR03YbpeqSKlJzJr4YSJOuVLxAYHvhhVDIEXT8R8qzoIALEos8DTIRZdWdVi6CwU9_DY3l3GXAJfAJva2cCWLseHoqBhf-J64pahwCAZpxf55U-tAo88tQ0-yOne3rX0z_yb8Lqc4M0YM/s1600-h/2012091901%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;2012091901&quot; border=&quot;0&quot; height=&quot;418&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEireH2ldCHsGIa1CPiJ41-1nrMKPv0h8OTgbomlfL5IWDxSAINth0Xq_GpWQBIYidMUnx0Fd_513MO4v6TVE9xk0vQRWDAdhkfDil4oBcSxpEkij2Orv_JCGqSSktEVhFcOJZ2Y7V5eZNU/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091901&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;空のMVCテンプレートを選択&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKK9RWJfDPZTFBzKhyo5rgtDQrKqqTa4FBAks-TQGNqNHS_1iYPSmBYiXov1AMUxQbLQwPWwoBD7Pr-82QqXcs5l6dPiat_3aOS1YIo2Gf6nRt5nef6umTdff9X1psrJ6btDWal9YZgIY/s1600-h/2012091902%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;2012091902&quot; border=&quot;0&quot; height=&quot;434&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK0Sz4ZVV8QFmiq4HmlZcn3Rmj7eVcYYzWvo5ubgL_xj4IRnpqo8yinwwWoP-hTeHNXza3MtoYQW2l9Cdk1vValHPOPJ8ezR2MKAdZf_2TPEgYSxbl6Ssmpzt36JfFrDxYyqOlYPCb_eQ/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091902&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　これでマスターページ等の用意されてないMVC開発がスタートです。実際始める前にNuGetでjqueryやらEntityFrameworkの更新やら入れておきます。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;NuGet&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-hLn5vWuAdF4TpCaP6TZnVt1Ixtxxu45GSNu7jSUCy2dT_X3PUGzS4otQuZs9EQMF9TkmtKaTSpVjIMkzU4OMUzmUnm40__MKzynapR9fI1PMzeT9TH-FRGcnPdLgO6P3oQphiDLcsnk/s1600-h/2012091903%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;2012091903&quot; border=&quot;0&quot; height=&quot;404&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx31JrhcxC-zZBiCKDjuw0uVTi8kt9vPWxEnxYtbqrzTIYaGvyREDRNnHDf9qXiW0KmXdH7RXN5nStKLxr9S1MdHPK0SJGOy8Rzj_I1gD5dqHqEyOM0syTreRbCMUku0P-qJi48vMkQco/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091903&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　それでは早速コントローラーとビューを作ってみます。まぁ初めてなんで「Hello World」しときます。一応ですがコントローラーはソリューションエクスプローラーから、ビューはコントローラーのコード上から右クリックで追加できます。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;コントローラーの追加&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilRg-3IvgHGsPb7Gw9cZY3sNywKcZ_wUjTbKte8LbULAI734JvC5O2haItmfGVzHdEBFb-ZwUV9CrMA_-J_MntZUxNUQ6Bv2HVWX-sqLHvaH3HvI9sUtx87NCZOwUUDfRR2jeGSTYNJp0/s1600-h/2012091904%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;2012091904&quot; border=&quot;0&quot; height=&quot;311&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipG_9Dep-UBdp8iMjUu-05uEsMd12w4Ci_k1DBnnouLXn2YwwEW8dzPsS86tEFXG6AOP_xVFHExq7QS6cbHDpZtrozLfN1TLaqNuHRaGnJrsRkE0L9VkShGXfutxhN9CFdCZdbTPLvy7w/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091904&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH8dedphKgO_g8-ZNkYoCFIFgwH96R7UJWYSSGmBanOaEsjaYvak4Ed0NVElxXQcjkF6pu5If20nB2pbGbGEYovQegZAAfIN5a9RF4pOjzd5diae_N4GqJXLko6z8rfL8_omgYW4UH4hQ/s1600-h/2012091905%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012091905&quot; border=&quot;0&quot; height=&quot;344&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpfndhuFSP6wCAXvCoCUy-1_QlpFDicI-Nd56SSXMRSeGruoEcYGN46MZPZa03szLa58FN79nTAI9oGa_L_EZa3AuPTgeF8E2DsAFrdpgWY5nQqqvzJWug1PM1o33u1TD2WRJ3uONHspo/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091905&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;ビューの追加&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUeobwhyphenhyphennZKe6RJSzy4DHahHiyOFzDuSX2IjYSWlBM2Md6IHNSHdjSv2VzampiblLE-HqrHsjU8xO-L-k0RWmPHBnTIVu2f3m63QTGrpcHIVdg15TC33h6HlTDN1dTPTaaxRosJNQWbho/s1600-h/2012091906%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012091906&quot; border=&quot;0&quot; height=&quot;472&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCH8GKhpXe48oCZLmrAXJB3vcEOdl7IVvf-C0UYsC9-Nw8DpEnVswumbeUf2c0ObP12mmaiX2PDxTt2D7OTEI_WacPKQRG3CzjaHea6J-YKtuHvVqY8A3T5xNw7CptzmqfI-O_z8UYN9s/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091906&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfcJB-6A8lOE-g97joWt6OEfWvl4QuJ7ebll6htgUCHlp9rHWc9SmTmxFvo8PJV354FXcPDKCEBgF1lbkSPbeYl1Cso5Lm43ITFTA0QhrRXNx9hCqJtTqtuptHQuOBdm4ARvN7tjwgbeA/s1600-h/2012091907%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012091907&quot; border=&quot;0&quot; height=&quot;332&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfJFLh3lXS7quT-lY3bcrZVAQlGjbfHA6gnSdgX2A5RS9tzXxcvJnMf-tvLWIZ52nJGMUht0pwknyPmhwQSnJJ-OeDMB8zVbE68uTKrGHAnOiH4B0PHBpE3cWIMS3oWo8enMMJXgjbx5M/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091907&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　これを実際に実行してみると以下のようになります。Homeって初期設定で呼び出されるみたいですね。&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
&lt;strong&gt;実行結果&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhkypQ-V_woAwolrXd1lz43lLbaj_BQVQjGubrxbHSuEFsNcSA9jCC0AOJVmvB2kXXSLXrI1iT71m95b6JTCXWIatrTvJqZq8bScaC0yfDaOVCRHUJ0GW-75EOMMt9AMPHgJaO9EZ6ubo/s1600-h/2012091908%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;2012091908&quot; border=&quot;0&quot; height=&quot;312&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_RimNDWw7b8pCTBSP49yhfXiRY1POurmfAB9Gaq7u5FMX_2-j4sffC6Ah7UFZlKMNskHRoXKCsleHrnyg-QrqaoA-N6yhoyIQr5cKH_6uwcG8eaFhIdjzM4EkHZhPcW_cDd9vHZQ7ox0/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091908&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　長くなってきたので今回はこれまで。次回はCodeFristをかませていく予定。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;訂正&lt;/b&gt;…テーブルの各Idフィールドがlong型になってましたがint型に修正してます。きっとこないだまでAccessの記事書いてたせいです。きっとそうです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=169194.10000927&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;B&#39;s 動画レコーダー 2&quot; border=&quot;0&quot; src=&quot;http://www.sourcenext.com/~/media/Images/af/ls/2012/pc_bs_000849/468x60.jpg&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=169194.10000927&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt;
&lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/aspnetmvc4-1mvc.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEireH2ldCHsGIa1CPiJ41-1nrMKPv0h8OTgbomlfL5IWDxSAINth0Xq_GpWQBIYidMUnx0Fd_513MO4v6TVE9xk0vQRWDAdhkfDil4oBcSxpEkij2Orv_JCGqSSktEVhFcOJZ2Y7V5eZNU/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-8444638060208665981</guid><pubDate>Tue, 18 Sep 2012 05:51:00 +0000</pubDate><atom:updated>2012-09-18T14:51:51.308+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">雑記</category><title>【雑記】本日の箇条書き</title><description>1．MVC4のチャートリアル（&lt;a href=&quot;http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4&quot;&gt;Intro to ASP.NET MVC 4 : Official Microsoft Site&lt;/a&gt;）をやってみる。今のところ英語オンリーの模様。APIはたぶん手を出さない、と言うかプロジェクト的に使わんと思われる。&lt;br /&gt;
&lt;br /&gt;
2．IFTTTってウェブサービスが便利だと知る。多数のサイト（BloggerやTwitterなど）と連動することができ、いろいろなトリガーに対してといろいろな動作を自分で簡単に設定することができる。自分は「ブログに新しい投稿を行ったら自動で報告ツイートする」のと、「新しいフォロワーに自動でお礼のメッセージを送信する」って作ってみた。&lt;br /&gt;
&lt;br /&gt;
3．他部署の子の結婚式の掲示用ポスターを半日かけて作成。もっと手の込んだのを作るのでデザイン料をください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=169194.10000932&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;ホームページ V3 (468x60)&quot; border=&quot;0&quot; src=&quot;http://www.sourcenext.com/~/media/Images/af/ls/2012/pc_hpg_000850/468x60.jpg&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=169194.10000932&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt; &lt;/div&gt;</description><link>http://lightstaffblog.blogspot.com/2012/09/blog-post_126.html</link><author>noreply@blogger.com (LightstaffBlog)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-2953299311790270951</guid><pubDate>Fri, 14 Sep 2012 23:22:00 +0000</pubDate><atom:updated>2012-09-15T08:23:16.830+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">雑記</category><title>【雑記】OSを再インストールした話</title><description>　今使ってるPCのOS（Windows7）を再インストールしたったってだけなんですけどね。理由は何となく開発環境周りを整理したかったんです。最初はいろいろ試しに入れてたSDKとか消しちゃいたいなぁと思ってプログラムの削除を地味にやってたんですけど、いまいちVisualStudioとかに元から入ってたものとの区別がつかなくなってきちゃって…。&lt;br /&gt;
&lt;br /&gt;
　それにしても何か年々神経質になってきちゃって…。別に全然問題ないのに最初のドライバ入れる順番を自分の思ってた順番と間違えちゃって最初からやり直したり、SP出てんの忘れてて0からアップデートしてたのが気に入らなくて最初からやり直したり…。こりゃ終わらないはずです。まぁ、自分の使うものはこだわってセットアップしたいよねってことで。&lt;br /&gt;
&lt;br /&gt;
　それにしても再インストールして初めて気がついたんですが、&lt;a href=&quot;https://www.google.com/intl/ja/chrome/browser/?hl=ja&quot;&gt;GoogleChrome&lt;/a&gt;って色んな個人の情報をどうやらクラウドに保存してるみたいなんですよね。再インストールしてGoogleにログインしただけでお気に入りやら色んなサイトのログイン名やパスワードまで元通りに…。パ、パスワード…キャッシュじゃなくてクラウドに保存されてるとは…。もうChrome使ってるときにパスワード記憶させるのは止めとこうと思った今日この頃でした。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=252926.485&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;HP Directplus オンラインストア&quot; border=&quot;0&quot; src=&quot;http://h50146.www5.hp.com/directplus/aff_banner/bnr_personal/notebooks/2012/09/0904/468x60.gif&quot; /&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=252926.485&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; /&gt;
&lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/os.html</link><author>noreply@blogger.com (LightstaffBlog)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-1844598112591799237</guid><pubDate>Thu, 13 Sep 2012 02:21:00 +0000</pubDate><atom:updated>2012-09-13T11:22:33.310+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">雑記</category><title>【雑記】本日の箇条書き</title><description>1．VisuaｌStudio2012が気になる&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
　新しいもの好きなので出来るだけ気にしないようにしてたんですが…。&lt;/div&gt;
&lt;div&gt;
　たまたま現在開発中のものがWinForm+WCFじゃなくてAsp.NetMVCで実現できるんじゃないかって思い始めてMVCって今3.0が最新だよねって思ってたらいつの間にか4.0が出てて…って感じで辿っていくうちにVS2012が正式にリリースされてるのに気がついてしまったわけで。&lt;/div&gt;
&lt;div&gt;
　それにしてもこれアップグレード版は無しですか？&lt;br /&gt;
　(&lt;a href=&quot;http://www.microsoft.com/visualstudio/jpn/&quot;&gt;http://www.microsoft.com/visualstudio/jpn/&lt;/a&gt;)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
2．本屋が遠い&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
　ちょっと気になってる参考書があるんですが、どうやら片道2時間の本屋にあるらしい。チェーン店なんで近場に取り寄せが出来なくもないんだけど取り寄せちゃったら中身がハズレでも買わなきゃいけませんよね？というかそれならAmazonでポチるし…。&lt;/div&gt;
&lt;div&gt;
　行くべきか、行かざるべきか…ってもう2日くらい悩み中。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
3．翻訳された書籍の値段&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
　なんで翻訳された書籍って元のより1000円近く高かったりするの？っていう愚痴。ケチって原本買って自分の英語力の無さに絶望した今日この頃。　&lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/blog-post_13.html</link><author>noreply@blogger.com (LightstaffBlog)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-6142283929194779056</guid><pubDate>Wed, 12 Sep 2012 00:47:00 +0000</pubDate><atom:updated>2012-09-12T11:06:14.996+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Access</category><title>【Access】VBA無しでどこまでできるの？最終回</title><description>&lt;p&gt;　&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/accessvba4.html&quot; target=&quot;_blank&quot;&gt;前回（その4）&lt;/a&gt;の続きです。&lt;/p&gt; &lt;p&gt;　最近、長くなりがちなのでさくさくやっちゃうぞーってことでレポート作成です。クエリは&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/accessvba3.html&quot; target=&quot;_blank&quot;&gt;その3&lt;/a&gt;の時にほとんど出来てるんでちょこっと抽出条件をフォームを参照するように修正してやればOKです。月別の抽出条件「Between [抽出開始] And [抽出終了]」の部分はメニューフォームに入力された年と月を条件にするため、DateSerial関数を用いて抽出開始と抽出終了を割り出します。式は「Between DateSerial([Forms]![MenuForm]![txtReportYear],[Forms]![MenuForm]![txtReportMonth],1) And DateSerial([Forms]![MenuForm]![txtReportYear],[Forms]![MenuForm]![txtReportMonth]+1,1)-1」となります。「txtReportYear」と「txtReportMonth」はメニューフォームに設置した年入力テキストと月入力テキストの名前です。&lt;/p&gt; &lt;p&gt;　さて、ウィザードで一発じゃぁって感じで行こうと思ってましたが実際やってみると何かごちゃっとしてて気にくわなかったので手作業でシンプルに作ります。&lt;/p&gt;&lt;br&gt; &lt;p&gt;&lt;strong&gt;日別レポート（商品ベース）&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;デザインビュー&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHfxhZvnwEwIil6pXNVzXwiGPWwdcvQrde4PSLbf_Z-Z10TJUZpAfyh4XlGOY6I-1YWjOtRFzs4eR3baYHM3ZFp4LBGMwL8PxVb3ftRSay_zJ9I0yQYEnIoYtKEeD0T9q4AEuXc0wFrSo/s1600-h/2012091201%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091201&quot; border=&quot;0&quot; alt=&quot;2012091201&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpMQIg_wjsfOqjoqsAwLGXNYy5GmW5WqPbkeKOYUcU9c46La8o84FgnXC_Q5O-l4Y7Wta4lLNmCtGirKt2dHImax_tHuHjIfsKP5KEZRtMdmkADrYWsuM8su_Avvskjs_JJ5wc7vRErPk/?imgmax=800&quot; width=&quot;604&quot; height=&quot;404&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;印刷プレビュー&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSy0l4J-UnrKm2UmWMKcIAcDPRrqlE1WO5Al81BioEvHth0myD_V91uDMSP0Xqgef9N_qeA_R0Dp3aebKVG3V1Va9gW1bpm1AGjrzBjuEJodmpulxru2ExWVF1BqO12WWiKfO5EjN9pkU/s1600-h/2012091202%25255B6%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091202&quot; border=&quot;0&quot; alt=&quot;2012091202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoS9K0pYznU3WtfgfW8eBuO-_VPmdV_E4EOV6Yp1bGgw0S5Cvddcon5V6rE4W_FpJmXBv6zKbTeT3s8p63sL8NAsZsuxamtZl9rOHhP1aMhSAgfZ1rgiIFCChe7D1SpzYR2SOszAdylkU/?imgmax=800&quot; width=&quot;604&quot; height=&quot;312&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;&lt;strong&gt;日別レポート（メーカーベース）&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;デザインビュー&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjORq-brSgClIHLyHrNKb8nlliPssHx7NdaJ24HrpVxIAU0QumSwT2-MQLcWk9YVqOBpS_b4rYHDtp9q9-7nI8qNCoJryPYLJL84aLQLYE-AoW40obOYLlm53ecgsrWQKajec2sT_J4IQU/s1600-h/2012091203%25255B4%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091203&quot; border=&quot;0&quot; alt=&quot;2012091203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaT_wdA8AZK2OY_z81iIrv8FZt_oLiI0uTwhE9khDJYx26X9YyeQRGEZjfWRA5ZjrJZ677vFzNrWgXfxgQ-WuNNNBULpxQark3PJddLyiMclvaYTwvznF4ghPnsIieKhNTWfXtUk1HY2w/?imgmax=800&quot; width=&quot;604&quot; height=&quot;382&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;印刷プレビュー&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitWLP3KT4o8qFP3eHrv_pU21vd0g9YUWB-v4-Osvmw2rxM1G7pharYJN17zRg75UaXfBDptfK2iusIEHewsXyAO3i0MycOJ6dj8H7m7nfc4K7wIJdG22BhI1oPofc3ZZv6ea3XlR6rI8U/s1600-h/2012091204%25255B4%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091204&quot; border=&quot;0&quot; alt=&quot;2012091204&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3JLd2vJnr4ni7TWo5ov6S2U-Fkl0_f1t5El4sTAx_FeDbwi3cDBGFf0nWCnaAugk-bxYKshyphenhyphenstttB3e3JcPKp0elueBq0VriP9gZGovTPxa-uezpxE11D33ytyXEyDaFxzYwzOGLs99M/?imgmax=800&quot; width=&quot;604&quot; height=&quot;156&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;&lt;strong&gt;月別レポート（商品ベース）&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;デザインビュー&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7iQGa-bxf00MAP_9QpH83XwY9OVgfTZ8R-JKZscfwfFb3nngHY2gCMRq9gq1f083La6g0ZrnsyEjBvucgONJzkLuxa0iHsjac8VKzpNbGfvc8r95mtEJij9-nN1BN1lxw-onuu7yEReE/s1600-h/2012091205%25255B4%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091205&quot; border=&quot;0&quot; alt=&quot;2012091205&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZIyUQ-V_w0MG27P0B9GlZCVwcQTYVcP3gz5yyp3OSD5OL4ZNqnIB98yfmrnmxx-LhYeFwPRDaMtghYspcOMh1l7rZ50p7yJPyWymwvUOUSdwlgXbOPOavXAtHRjm8_E9zdFF0Ug-dQyw/?imgmax=800&quot; width=&quot;604&quot; height=&quot;396&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;印刷プレビュー&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb794j8Hy_0m4o77TvTDILK2Thgzb4DjruW422Bz73_7v5M96HT30GQL4VI45lS_VPeuiHyjBMPUvDeSgKn1rzxrHRFurNuxr5CFPhB12n7lDiKMf9CMUDeLnpCJdz0eoUfVzfhMY_IEk/s1600-h/2012091206%25255B4%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091206&quot; border=&quot;0&quot; alt=&quot;2012091206&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4Nx8ul_OCaslTD07aEuMHFRVKZSPXT_UiuU2dyC2LkiqegnSBWaDOGEX1sBmHC1MbCqCZQMMtl8UITCx3fl2yntO-mlQE_3X_6JLwwFh9NbkYvS2-b-BK4widItTm9WjFqHAOmZP9Yak/?imgmax=800&quot; width=&quot;604&quot; height=&quot;316&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;&lt;strong&gt;月別レポート（メーカーベース）&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;デザインビュー&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCsGy9AXBVBfe_VeMV1Tn7kScz-0xRtGgl1cVPDrXHzEnVZf7IYpDz-DVlonXCum0zmc5o3NJx7UPw2GXf_QfWVbmef-htOBgaZnbsX2n5Zqm2DAQip4bVBxEN9hXEhuiFX7-H0AxvDvc/s1600-h/2012091207%25255B4%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091207&quot; border=&quot;0&quot; alt=&quot;2012091207&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwIMpg_OmEknQ5BdYSQLtmZ0xuqIr0-WbhajxLB7XtnIvbIAIJ9Gk0avIpJGM3q7YJYZ5ja2mno4lD4IknIIo-apdhtLQAwBF8KRK7RK7V40Iv1Igj-IkJlhqjU-sv7xo2KbDP6JbOXVQ/?imgmax=800&quot; width=&quot;604&quot; height=&quot;379&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;印刷プレビュー&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7TisOIoQW5dHZR94GmgMkxr-8vfBKeWLYoKAqL0z0Uhr0GiPHiqzTY8FwNzDe0b5mpt2FyOloBtzmYtUUznzOEFTLZctDS6rw9xUKzpP0nN2u2fihi3-fbAhP7cEJQEkn_dVj_Ozwf44/s1600-h/2012091208%25255B3%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091208&quot; border=&quot;0&quot; alt=&quot;2012091208&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAyrVP4ViECT_Dbak9KcSMpa7syOtkPpj2SC5_wth3a2WIVsHRU8LBifCls4yjy1_mv7VEzihh-adbs9dPYsPkW8AN3VmlaOjFK4GIR-w5wQM0Y_xOBvR1vbCFyvqngVSIP8VmhczOgy8/?imgmax=800&quot; width=&quot;604&quot; height=&quot;204&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;　特に手をかけてないんで一気に出しちゃいました。メーカーベースの方は若干寂しい気もしますがまぁ良しとしましょう。どうでも良いことですがレポートの罫線ズレが気になる人は手で上位置、左位置を入力したらちょっとはましになりますよ。&lt;/p&gt; &lt;p&gt;　もうマクロもやっちゃいますか。&lt;/p&gt; &lt;p&gt;　まずはおなじみ（？）AutoExecです。マクロ名に「AutoExec」とつけると起動時に自動実行されます。これにメニューフォームの起動を設定します。あとは各フォームの起動、各レポートの起動、在庫計算のクエリの実行を作成すればOKです。「マクロは簡単なやつしか駄目！」ってお約束なのでどれもオブジェクト名と表示形式を指定しただけにしています（なので画像等は載せません）。あとは作成したマクロをメニューフォームの各ボタンに割り当てるだけです。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;割り当て中の図&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqEKoT9b5w8IFs0_TovAI_d0PEI88AWSjMicDmvdYVY0pwzDKmMZuzv6PoU-1ueUagTokpyZthmpXuQQJLIeSMZ5esHgRssROt-korD3Gf4-aqWKHcVWBXowHqXykRVTgKqzxfI1JXcYA/s1600-h/2012091209%25255B5%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;2012091209&quot; border=&quot;0&quot; alt=&quot;2012091209&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYrskpU1G54dNoqac2alFRz3qWXk6YERBwdXTH57p-PhprZRm-oQnxjqR3DhCYWsFhkOtNweYFgmu3eX9uY7QOAKphPMMpOTXPY8x2O9aibxVm732Fw_esgrqSD7OU14a9lXObIT5UWKI/?imgmax=800&quot; width=&quot;704&quot; height=&quot;296&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt; &lt;p&gt;　これでついに完成です。…終わり方があっさりしすぎですか？&lt;/p&gt; &lt;p&gt;　結局5回も費やして初心者に優しくない初心者講座みたいになってしまったような…。まぁ、VBAは何とか使わずに乗り切りました。在庫計算とか若干ひどい気もしますが、まぁこんなもんでいいでょ？◯◯くん。&lt;/p&gt;&lt;br&gt;&lt;br&gt; &lt;div class=&quot;adlink-post&quot;&gt;&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=114631.10000750&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img border=&quot;0&quot; alt=&quot;All About スタイルストア&quot; src=&quot;http://img.allabout.co.jp/stylestore/banner/AF/stst/shien.jpg&quot;&gt;&lt;/a&gt;&lt;img border=&quot;0&quot; src=&quot;http://ad.linksynergy.com/fs-bin/show?id=hTRkOF7cC5Q&amp;amp;bids=114631.10000750&amp;amp;type=4&amp;amp;subid=0&quot; width=&quot;1&quot; height=&quot;1&quot;&gt; &lt;/div&gt;  </description><link>http://lightstaffblog.blogspot.com/2012/09/accessvba5.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpMQIg_wjsfOqjoqsAwLGXNYy5GmW5WqPbkeKOYUcU9c46La8o84FgnXC_Q5O-l4Y7Wta4lLNmCtGirKt2dHImax_tHuHjIfsKP5KEZRtMdmkADrYWsuM8su_Avvskjs_JJ5wc7vRErPk/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-3781881174522689068</guid><pubDate>Tue, 11 Sep 2012 07:05:00 +0000</pubDate><atom:updated>2012-09-11T16:06:31.592+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">雑記</category><title>【雑記】本日の箇条書き</title><description>　最近、Accessネタばっかりなのでたまには箇条書きも書いとけって感じで。&lt;br /&gt;
&lt;strong&gt;1．データベース的な悩み事&lt;/strong&gt;&lt;br /&gt;
　開発中の案件でマスターの分際で年間1万5千件くらいの行になりそうなのがあるんですが、こいつをどうやってクライアント側に見せてやろうかって悩み中。年間1万5千件って数年で5万件くらいになるってことじゃないですか？これをWCF経由でフォームにリスト表示しようと思った場合、そのままだと通信量的にタイムオーバーになるのが目に見えてるわけですよ。なんで何らかの条件付けして件数を絞るしかないんですけど今のところ良い絞り方が見つからん。個人的にはデータに1行毎に日付的な使用期間を設けて日付範囲で区切ってやるしかないんじゃないかと思ってるんですが…。件数を多いといちいち期間打つのしんどそうだよなぁって思ったりもする今日この頃。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;2．会社のホームページを作る気になってきた話&lt;/strong&gt;&lt;br /&gt;
　&lt;a href=&quot;http://lightstaffblog.blogspot.jp/2012/08/blog-post_1132.html&quot; target=&quot;_blank&quot;&gt;以前の記事&lt;/a&gt;でホームページ作りませんかって営業されて「自力で作れるわっ。」って言ってたけど、いよいよ作ってやろうかって気になってきたので無料or激安レンタルサーバーを探してみた。色々探してみたけどやっぱり無料は広告が入っちゃうからNG。安いとこだとあんまり企業向けじゃないけど&lt;a href=&quot;http://www.sakura.ne.jp/&quot;&gt;http://www.sakura.ne.jp/&lt;/a&gt;とか&lt;a href=&quot;http://lolipop.jp/&quot;&gt;http://lolipop.jp/&lt;/a&gt;とかが無難かなぁ。さすがに1ページで済みそうなサイトに毎月何千円もかけるきにならんし…。たぶん求人情報メインになるし…。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=39250.10000701&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;デル株式会社&quot; border=&quot;0&quot; src=&quot;http://i.dell.com/images/jp/banners/banners_l/dell_con_728x90_2.gif&quot; /&gt;&lt;/a&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/blog-post.html</link><author>noreply@blogger.com (LightstaffBlog)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-3708245871589079663</guid><pubDate>Tue, 11 Sep 2012 04:42:00 +0000</pubDate><atom:updated>2012-09-11T16:15:42.636+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Access</category><title>【Access】VBA無しでどこまでできるの？その4</title><description>　&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/accessvba3.html&quot; target=&quot;_blank&quot;&gt;その3&lt;/a&gt;の続きです。&lt;br /&gt;
　今回もちゃちゃっとやっちゃいますよ。まずは必要になるフォームを考えてみます。当然メインとなるは売上台帳ですね。これをつけるために作ってるんですから。あとは各種マスター編集用のフォーム。それからと…。&lt;br /&gt;
　「&lt;strong&gt;ああっ。&lt;/strong&gt;」&lt;br /&gt;
　って本当に声が出ちゃいました。自分、完璧に「在庫データ」なんてのを作ったことを忘れておりました。…これどうしよ。ま、まぁこれは後で何とかしよう。&lt;br /&gt;
　若干動揺しましたが、とりあえず売上台帳から作ります。色々ギミックを仕込んで…といきたいところですが、とりあえずはシンプルに作ることにします。というか実際色々とシミュレーションしてみたんですが、VBA使えないとやっぱり苦しいところが多々あったのでぶっちゃけ諦めました。&lt;br /&gt;
　ここでひとつお詫びが…、前回フォームにはクエリはいらんって言ってましたが、どうやら2つくらい必要になりそうです。1つが売上台帳用のクエリ、もう1つが在庫データ更新用のクエリです。いやぁー、無計画って怖いですねー（無責任）。&lt;br /&gt;
&lt;strong&gt;売上台帳用クエリ（物理名：SalesForm）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3KjmRX3JyKQoEWFTluUB62mSVhGKbxW5ltsFSwuY5edoNkEK5JCwulGlq3cQvsgKSLnNC7Engi91aOOToAsIWcp57AIo8mhcXWk6eN52ThOVRm9WJ-OiAiVY8dWV_qYHG39hignz8ohM/s1600-h/2012091104%25255B6%25255D.png&quot;&gt;&lt;img alt=&quot;2012091104&quot; border=&quot;0&quot; height=&quot;224&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwHAAsno0vF1zShDLrzpWVKNfU9F9Jl6dPUhYU_0wjX8qSCtNw-mBBLnoFJjFSRLj2BsE4sCfOx9J0P_eB8DJKjYGEsRD6YYQBkBk5C-NwdSO3qYQ93gTt1C9XV08O1ck6Pgjsq15Osg4/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091104&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;在庫データ更新用クエリ（物理名：UpdateStocks）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQRr6jAh1OkZ8dkivcsBOWRh46LHKyT-m1be-S5588NsKFBHdjmzPNYFiKwqH9q5v9tixYfXLSE85AiuAXNuBYlqkSlGlKdQCLAEFF7Zu-7wlJhEgRllqcDs8NQZFaTvyNSvxZ9awwsdE/s1600-h/2012091105%25255B10%25255D.png&quot;&gt;&lt;img alt=&quot;2012091105&quot; border=&quot;0&quot; height=&quot;409&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdbpIkueV-ajB020sGraRC6wmroApLUeuZ62_lM12QCBhUgMdI6aYpjBTwBLEdwKUVXour1fpUnc3kTlqpwwJU-tE8ff-yj_DueAahTrJBjF7GTbAHmNwYorbx-GEKSUf32XIRut9_5YE/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091105&quot; width=&quot;404&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
　在庫データ更新用クエリが難解に見えるかもしれませんが、要するにパラメータ「日付」で抽出された「Salesテーブル」と一致する「GoodsId」を持った行の「Qty」を「Salesテーブル」の「Qty」で引いてみなさいってことです。何か余計に難解な文章になってしまいましたね。売上台帳用の方は「入力日」というパラメータを用いることで入力する日を限定してしまおうって魂胆です。入力時に以前のデータがづらづら表示されても邪魔なので。&lt;br /&gt;
　ではやっとフォームです。&lt;br /&gt;
&lt;strong&gt;売上台帳（物理名：SalesForm）&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;デザインビュー&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKMUnlT5H9395p7JSm4rvCIPKcwPGXFu-U4Guvir5JuTtg28kDxej0lQP_gJq1yKd1MsEDyM-cZ9vV6Nt_oeKaDSIKCMYnU5Rq1Z8mu6_Xrn7BVIzkPloxZanu2xwW0GySepOiJu-Kjbc/s1600-h/2012091102%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;2012091102&quot; border=&quot;0&quot; height=&quot;296&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgffFamTD3nB5UXKvdaox1w1QhDcb2iRkV6psQmS3GF4_G65fhBqUsy3fiimCWOlKzTzNei2Ua6MX5rae9LAiAfDVDNoYyeoe2cmZXfNgAZ5-u573xjFd9c7ow8D68HmVg3nX1hyphenhyphengXY0-4/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091102&quot; width=&quot;504&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;フォームビュー&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnpxvpTcs98p11ZcLLXepIGs3jckfe_FF4Nt3m7K667p4-LYD487tCu7TDiOl_Jx3UA6YgoNQxM_NF5btkVexDJdFXY90NK4XwnjgqGJPwrCDh1RDPMON8md5VTKA-iURtPYSRryn1ows/s1600-h/2012091103%25255B20%25255D.png&quot;&gt;&lt;img alt=&quot;2012091103&quot; border=&quot;0&quot; height=&quot;466&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGTjx6reXjhmBknfOivROtuJfcoKH-WSi9zHLYKjD7b1DEzi9cTYICT4HTe_gKTdPJ5VE0oKj73J7FU9LSvooZhoai19iC2HhMhMvwy8Fi4Wyv9HG92eD4hRuTKgDJbHZP9K5CR39mkqU/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091103&quot; width=&quot;504&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
　ちょっとシンプルすぎないか不安になりますが…。データソースはもちろんさっき作ったクエリです。見ての通り「SalesIDフィールド」と「SaleDateフィールド」は非表示に、「GoodsIdフィールド」はコンボボックス化して商品名を表示するようにしています。コンボボックスはよくある手法なのでいちいち解説しません。ヒントは列数2、列幅0,◯cm（◯は任意）。「SaleDateフィールド」の既定値は次に作るフォームから引っ張ります。&lt;br /&gt;
　次は売上台帳の入力日を確定する作業を入れたいのでそれを行うフォームを作ります。実際の作業順序からするとこいつがAccessを起動した時に表示するトップフォームになりそうなのでいっそのこと色々乗っけてメニューフォームにしちゃいましょう。&lt;br /&gt;
&lt;strong&gt;メニュー（物理名：MenuForm）&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;デザインビュー&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAwFj6f4ytdK3XJd5qUWcKkTmgShaTQ7hZl2rgepbUND25lS3JjahJ0IhPhwWVdRAnvRjv2l-_RLiuD6_jgf6SNn9aO5E-ukyZ4fypVKGmdNS56xJD2A4KxqGFjbGAGXmRUNqgB86o9sY/s1600-h/2012091106%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;2012091106&quot; border=&quot;0&quot; height=&quot;308&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpoTeQIXtzzzUnuNuRbaWY0aI4nlaVkZqv1LQ-yHpP0YlteMPL60SjZznKmjGSVzO9YjEBWZLQh5-CYfO3qy4Gz7UwhJAaMHwOFOYnX_wTwNWheaGj0duMBdROwIXfq4M4MKLpX-VOy34/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091106&quot; width=&quot;504&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;フォームビュー&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWxHIc6fpHuGlkSIXypPm3rYUg49gFtgToXkmmVIQ8CW_93mMc7kfMbPpo4GNpuW_buMnvg8ZPANhaNi2ElkKk-nNW__jRoVbUJOPve_mMD4VlBfenP7muHDb3IOiL944JBGtt4wEBXCA/s1600-h/2012091107%25255B6%25255D.png&quot;&gt;&lt;img alt=&quot;2012091107&quot; border=&quot;0&quot; height=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3FXVJUS7Tum6wnQOaGrUtRZ_8oz0Z7oZIvYpx0DRCFUla6a8S8EDqoViKiykDSS6GhV71jtoDziG1wJyVv94FFep7d-R74xjCi1TBnjqsx_m0O1zdzxOUVJhHHPutwFfWGbio5Xrr1eQ/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091107&quot; width=&quot;504&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
　おぉ、メニューフォームを作ると何だかそれっぽく見えてくるものですね。何かこれだけで満足しちゃいそうですが、クエリ等のパラメータをこのフォームに設定し直します。一応、下記に一例。&lt;br /&gt;
&lt;strong&gt;クエリ修正一例&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM0B4bTdBBZ302wmurRZlGBhodq2qQsuGZNNsVj2AzRn_cdLhysoFsa4VyRBOQ7q_0wwXMcswVEd7Va64VYR9IsHyKA8O7FGDph0iVsrFZWtvkJN6l-X20Ipx1_7pIh206nkvmT6xRLEc/s1600-h/2012091108%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;2012091108&quot; border=&quot;0&quot; height=&quot;196&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjELUhhiXHZoih7Z3WwpGjQ9lRUSogpZnzSmG7EWD_qoVk_-ufWU01qxCAKJktgp_3Gh-LAEwqFD0_LiYsj8yQ9vixy3cFafJ_gCMh510Xxaf1m-p9tEAHJlkWtSCgoM36SvUxFPSF1G30/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012091108&quot; width=&quot;504&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
　このように抽出条件を[Forms]![対象フォーム]![対象コントロール]とすることでフォームのコントロールを参照することが可能です。これで売上台帳はメニューフォームで指定された日付で表示される予定です。&lt;br /&gt;
　フォームを2つ作っただけですが、なんだか雑多になってきたので今回はこの辺でやめておきます。あと、マスター編集のフォームは&lt;strike&gt;面倒くさいので&lt;/strike&gt;省略します（ウィザードで一発で済むので）。&lt;br /&gt;
　次回はレポートと出来ればボタンを動かすためのマクロを作ります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=252926.472&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;HP Directplus オンラインストア&quot; border=&quot;0&quot; src=&quot;http://h50146.www5.hp.com/directplus/aff_banner/bnr_personal/desktops/2012/08/0809_ms/728x90.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/accessvba4.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwHAAsno0vF1zShDLrzpWVKNfU9F9Jl6dPUhYU_0wjX8qSCtNw-mBBLnoFJjFSRLj2BsE4sCfOx9J0P_eB8DJKjYGEsRD6YYQBkBk5C-NwdSO3qYQ93gTt1C9XV08O1ck6Pgjsq15Osg4/s72-c?imgmax=800" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4080260435552833277.post-3556432098237770065</guid><pubDate>Sat, 08 Sep 2012 01:26:00 +0000</pubDate><atom:updated>2012-09-11T16:16:01.213+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Access</category><title>【Access】VBA無しでどこまでできるの？その3</title><description>　&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/accessvba2.html&quot; target=&quot;_blank&quot;&gt;その2&lt;/a&gt;の続きです。&lt;br /&gt;
　順調にテーブルができたので次はクエリに移りますが、やっぱり初心者はクエリって難しく感じるみたいです。リレーション自体を掴めてないせいもあるかもしれませんが何をどうくっつけて、どう条件をつければいいのか分からないって人が多いようです。そんな人にはまず完成後の表をExcelか何かで書いてみることをお奨めします。もちろんフィールド名から書式まで理想とする完成形を作ってみて下さい。あとはそれを逆算的にクエリが作成できるよう分解していきましょう。このときクエリを無理に一纏めとかにしないよう自分のレベルに合わせて細分化します。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;例&lt;/strong&gt;&lt;br /&gt;
Dをグループ化したクエリ（完成形）　←　BとCを結合したクエリ（D)　←　Aに抽出条件を設定したクエリ（C）　←　テーブル（A）&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　←　テーブル（B)&lt;br /&gt;
&lt;br /&gt;
　例のようにすると一つ一つのクエリの難易度が下がるので多少はやりやすくなると思います。自分は今でも定義に悩んだ時はよくやったりするのでクエリが分かんないって人はやってみてください。&lt;br /&gt;
　では本題に戻って今回使用するクエリを考えてみます。今回、フォームは直接テーブルを操作するケースが多くなりそうなのでクエリを利用することはほぼなさそうです。せいぜいコンボボックスのソースにってとこですがこれはコンボボックス内で定義します。なのでクエリを利用するのはレポートのみになりそうです。作成予定のレポートは&lt;a href=&quot;http://lightstaffblog.blogspot.com/2012/09/accessexcelaccessvba.html&quot; target=&quot;_blank&quot;&gt;前提条件（VBA無しでどこまでできるの?その1）&lt;/a&gt;からすると日別売上レポート（商品ベース）、月別売上レポート（商品ベース）、日別売上レポート（メーカーベース）、月別売上レポート（メーカーベース）ってとこでしょうか？それでは各レポートに使用するクエリを考えてみましょう。&lt;br /&gt;
　さて各レポートに使用するクエリと言いましたが、結局のところ全部が売上に関するレポートなので大本になるのは売上データになりそうです。売上データを日別、月別に抽出し、それに商品なりメーカーなりを結びつけるなりグループ化するなりすればいいじゃないか？って感じです。&lt;br /&gt;
　では早速、日別、月別に売上データを抽出するクエリを考えます。これよく考えると1つで済ませることできなくはないんですが、今回はまじめに2つ作ります。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;日別売上データ（物理名：DaySales）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiBONKuQPUSAA7IkZUHnGuXRXQmxx8k16x46rC4RHRY_85gmDl-BwreAWgYvIOTAld40CeVlOiOxGtKm4pTnIdq5STfcg5UCktcnsAyGXipDxlxV4rwxPAyuIy5RYSasS-FYCE0CF__yc/s1600-h/2012090801%25255B30%25255D.png&quot;&gt;&lt;img alt=&quot;2012090801&quot; border=&quot;0&quot; height=&quot;204&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXZPFGsKM_O-LXuH38VYuRQjU1pDw_4Hb9jyk-MTnY83Au0F2nhsNZWlgKjpr2aC4NfvfhBZKXbkg8RTRiAK8sZ-7l6pCNZOK25FdNqeQAO0I6nSb31LdE3Mjr4Aj7VgCRNurCD4OWj4U/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012090801&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;月別売上データ（物理名：MonthSales）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz9wm3LHcZ6ZzX22iVeokwEtZQoLI8GU3dIH6vP89lcU1bOOWE8IxWSkCSoDITB6RJ9ATiKaapwnsnC8hiYDy2Y9w5pKsMAaiUo7kdZbt4g8R2flHLsmxgg_kl7Ui8Yc7kltmhLw0TEfM/s1600-h/2012090802%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;2012090802&quot; border=&quot;0&quot; height=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaf8ChB-BP6HVhGww0Wco9QlpnuJ_m9xx8bBMMHmOwtI845HhJpIpy7O4ckJPhX3TcfnL3vdm7G2Oappw41y-jr6woID5IB7C8q-SGSkr9vsLoHs082BRN7iZjkLrrmKCwpLes0wc5YiE/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012090802&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　う～ん、ちょっと幼稚するぎるかなぁって気もしないでもないですが…。一応解説しておくとWHERE句に入力している[]に囲まれてるのがパラメータになります。このパラメータは最終的にはフォームから引っ張るようにする予定なので今回は仮のパラメータです。&lt;br /&gt;
　さて、面倒くさくなったわけではありませんがあとはさくっと完成させちゃいましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;日別売上データ（商品ベース）（物理名：DayGoodsSales）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5d8MsBT1JZ6mxmnxyvN4eHchPjjulR5YXQBcvWnjwkpH839u5Kh1nLU1uSYjMS7NgPpZmqah4HEMko_LhU2iaQY_W8MldH5DpVnVL716KW1uRmLkRwT1udBj4JSNYWZtQx8u4NgFqzC8/s1600-h/2012090803%25255B14%25255D.png&quot;&gt;&lt;img alt=&quot;2012090803&quot; border=&quot;0&quot; height=&quot;151&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioVUM8tm2C1p0uRhCo_TnuAm4bm9WG7_I95rQAW3sS8LeI4fufYByjLs6cvXWzDONcIHtDk2G-NN1R3pZLqgz70XcxYQdpUl3vbUwxBn46FYeWn1ye0wfFPQg4mCqk1FPmo2v73ScoXCo/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012090803&quot; width=&quot;804&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;月別売上データ（商品ベース）（物理名：MonthGoodsSales）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVc8T6wXA6T_cYlwmdO5shs17tdAXNxTUmbQQIHypHxtpnBdOdA_iQ3Saq1HogNdLt5QzTY2TxEdkoOJiwuUuil0g5Yn0XdWcaPHFjZAmtBmrlhOogJPWJ_xEBZdyigjKj1OEwOiH41Ks/s1600-h/2012090804%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;2012090804&quot; border=&quot;0&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm7XVGoPeXIVGApauliGC_V75egEfps4-V4Cc8XUw19m9852g2yMyP-6kDutzun1yrS1Ya6qiZQgPgsa-oDxksnaIRlY40GnxDV4WC8zLbh4ru3yo-ibb2WfCkup9xhUxz0NinQoZZbwc/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012090804&quot; width=&quot;804&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;日別売上データ（メーカーベース）（物理名：DayMakersSales）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrVpIPPgy93v5I2-84037BkdOL-Va1cVna_2cTmM4C4qKefRuiEiYGYKWVdRDCMazq-jHq28-lMkjXZozbXXdUz9QHL3V_ZnsAyfJDcAMb2CnID1ZYhmNMXjgxXehqA9I5SRPFVUuCmZI/s1600-h/2012090805%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;2012090805&quot; border=&quot;0&quot; height=&quot;182&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_MHqMW6lGN0z-QpwXlflCjK02SzBJIgskVACBX2OFnaa87gdYiTXDLIpBkgP4T8wOA-hocGjc6XagJUpIYu-khvtJkZbXF_IP-5jNDMSKbGPPjpW5nfiIXG80vlePITjSEG6yJ22nLyw/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012090805&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;月別売上データ（メーカーベース）（物理名：MonthMakersSales）&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfnsFwSfbLzaqtV7CC84t1JgLWbbiumHYn5yHjsqkBe6aWn8GefoE0o2zK0AqwUFTNGdbqaeAwpMClssmVCnyQZxRZLycc9lBEjaQKGxPXpOUVes-j0_2jkrY24tCim4oTqR3ruIQlTUs/s1600-h/2012090806%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;2012090806&quot; border=&quot;0&quot; height=&quot;185&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDr8dA80AX_uTNHzJdRdglnphuCwxyDsSSF1MUoCCeJRZ8L0l52DEzlHuYJgTryiaSqte7gKTikR8mpP79o_XVSsyEp5eknQpsNmOdsSzyjjSghkpFfRQnZt3sU-4ZpDR_ESYFjk5dWBQ/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;2012090806&quot; width=&quot;604&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　こんな感じでどうでしょう。商品ベースで組む際にメーカーのフィールドも結合しちゃうことでメーカーベースの時に商品ベースをグループ化するだけで済むようにしています。&lt;br /&gt;
　こうやってやってみるとちょっと前提条件が緩すぎて簡単になりすぎちゃって初心者講座なの？どうなの？って感じになってる気がしないでもないですが、とにかく次回はフォームを作ってみます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;adlink-post&quot;&gt;
&lt;a href=&quot;http://click.linksynergy.com/fs-bin/click?id=hTRkOF7cC5Q&amp;amp;offerid=178652.10000247&amp;amp;type=4&amp;amp;subid=0&quot;&gt;&lt;img alt=&quot;trystrams&quot; border=&quot;0&quot; src=&quot;http://www.cassina-ixc.jp/media/Affiliate_bannar/trystrams468x60.jpg&quot; /&gt;&lt;/a&gt; &lt;/div&gt;
</description><link>http://lightstaffblog.blogspot.com/2012/09/accessvba3.html</link><author>noreply@blogger.com (LightstaffBlog)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXZPFGsKM_O-LXuH38VYuRQjU1pDw_4Hb9jyk-MTnY83Au0F2nhsNZWlgKjpr2aC4NfvfhBZKXbkg8RTRiAK8sZ-7l6pCNZOK25FdNqeQAO0I6nSb31LdE3Mjr4Aj7VgCRNurCD4OWj4U/s72-c?imgmax=800" height="72" width="72"/></item></channel></rss>