Archive for 2011年2月

モデルの概要~MSDNより

2011年2月28日

Controller と Model の境界に悩んでいたところ、MSDNに次の記事があって、明快になった。

以下は、http://msdn.microsoft.com/ja-jp/asp.net/ff633277.aspx より抜粋。

MVC モデルには、ビューやコントローラーにはないアプリケーション ロジックのすべてが含まれています。モデルには、アプリケーション ビジネス ロジック、検証ロジック、およびデータベース アクセス ロジックのすべてが含まれます。たとえば、データベースへアクセスするのに Microsoft Entity Framework を使用している場合、Entity Framework クラス (.edmx ファイル) を Models フォルダーに作成します。

ビューには、ユーザー インターフェイスの生成に関係するロジックしかありません。コントローラーには、正しいビューを返すため、または他のアクション (フロー制御) へユーザーをリダイレクトするために必要な最小限のロジックしかありません。その他すべてのロジックは、このモデルの中にあります。

一般的に、モデルは大きく、コントローラーは小さくなるようにします。コントローラー メソッドは、数行のコードだけで構成します。コントローラー アクションが大きくなりすぎた場合、Models フォルダーに新しいクラスを作成し、ロジックを移すことを検討する必要があります。

————-

指定された値に一致するルートがルート テーブルにありません。

2011年2月27日

 

Html.RenderAction で次のエラーになる場合、

‘/’ アプリケーションでサーバー エラーが発生しました。
——————————————————————————–

指定された値に一致するルートがルート テーブルにありません。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.InvalidOperationException: 指定された値に一致するルートがルート テーブルにありません。

ソース エラー:

行 24:
行 25:
行 26: @{Html.RenderAction(“TestDB2”);}

———–

Global.asax.cs の中で、たとえば次のように UrlParmeter.Optional を指定していて、シグネチャーがあいまいになって、Route を特定できないとこのエラーになるようだ。

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

    routes.MapRoute(
        “Default”, // ルート名
        “{controller}/{action}/{page}/”, // パラメーター付きの URL
        new
        {
            controller = “Home”,
            action = “Index”,
            page = UrlParameter.Optional
        });
}

———-

RouteValueDictionary での指定例。

@{Html.RenderAction(“Action”, new RouteValueDictionary() { { “page”, 1 }, { “param1”, 1 }});

この C# 研究室 Blog を、ページ文字化けしてるわよ~って言われても・・・

2011年2月27日

これ、一応文字化けじゃないんです。

自分用の備忘録なので、いいんです。

Html.RenderAction と Html.Action

2011年2月27日

HomeController.cs に

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

を追加。

Views/Home に次のView (Test.cshtml)

@{
    ViewBag.Title = “Test”;
    Layout = “~/Views/Shared/_Layout.cshtml”;
}

<h2>Hello World by Render Action</h2>

This is Hello World by Test.cshtm

————

を追加。

Index.cshtmlに、次のように、RenderAction を追加

@{
    ViewBag.Title = “ホーム ページ”;
}

<h2>@ViewBag.Message</h2>
<p>
    ASP.NET MVC の詳細については、<a href=”http://asp.net/mvc” title=”ASP.NET MVC Website”>http://asp.net/mvc</a> を参照してください。
</p>

@{Html.RenderAction(“Test”);}

———————–

これで、部分に別のRenderAction のHtml を挿入できる。

image

しかし、@Html.RenderAction(“Test”) として、中括弧なしにすると、次のエラーが発生する。

‘/’ アプリケーションでサーバー エラーが発生しました。
——————————————————————————–

コンパイル エラー
説明: この要求を送信するために必要なリソースをコンパイル中に、エラーが発生しました。以下のエラーの詳細を確認して、ソース コードを修正してください。

コンパイル エラー メッセージ: CS1502: ‘System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)’ に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。

ソース エラー:

行 8:  </p>
行 9: 
行 10: @Html.RenderAction(“Test”)

これは、RenderAction が void 型であって、Render Stream に直接Htmlレスポンスを返すため。

一方、Html.Action(“Test”) は、指定された子アクション メソッドを呼び出し、結果を HTML 文字列として返します。(返り値はMvcHtmlString を直接返す。)、

@Html.Action(“Test”)

では、期待通りにTest アクションが表示されるが、逆に

@{Html.Action(“Test”) ;}では、何も表示されない。

Html.RenderPartial

2011年2月19日

View と同じフォルダーに DinnerForm.ascxをストアした場合の指定方法

@Html.RenderPartial(“DinnerForm”, null); 

~/Views/Shared にDinnerForm.ascxをストアした場合の指定

@Html.RenderPartial(“~/Views/Shared/DinnerForm.ascx”, null);  

MVC Radio Button

2011年2月13日

 

View
<form action=”/MyContoller/HandleForm” method=”post”>
    <input type=”radio” name=”fruit” value=”apple” />apple
    <input type=”radio” name=”fruit” value=”orange” />oirange
    <input type=”radio” name=”fruit” value=”berry” />berry
    <input type=”submit” name=”press” />
</form>

 

MyController.cs

public ActionResult HandleForm(string fruit)
{
    ViewData[“fruit”] = fruit;

    return View(…);
}

藍澤光Blog貼紙

2011年2月11日

語音時鐘版 Get Microsoft Silverlight

MVC3 Razor で LINQ to XML(RSS、ATOM)

2011年2月7日

1つ前の例で、XML がRSSとATOM の場合は、WCFで追加された System.ServiceModel.Syndication を使用すると、もう少し簡単になることが、shiba-yanのヒントで分かった。

Modelの、class YahooRssModelがいらなくなり、

YahooRssController.cs を次のようにSyndicationFeed に入れて、Items をView に渡して帰してあげる。

using System.Web.Mvc;
using System.Xml;
using System.ServiceModel.Syndication;

namespace MvcApplication7.Controllers
{
    public class YahooRssController : Controller
    {

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

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

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

            XmlReader rdr = XmlReader.Create(yahooRssUrl);
            SyndicationFeed feed = SyndicationFeed.Load(rdr);

            return View(feed.Items);
        }
    }
}

Index.cshtml は、戦闘もモデルの定義を変更し、item 内のエレメントを表示してあげればよい。

@model IEnumerable<System.ServiceModel.Syndication.SyndicationItem>

@{
    ViewBag.Title = “Index”;
}

<h2>Index</h2>

<table>
    <tr>
        <th>
            title
        </th>
        <th>
            url
        </th>
        <th>
            Date
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @item.Title.Text
        </td>
        <td>@if (item.Links.Count > 0)
            {
                @item.Links[0].Uri.AbsolutePath;
            }
        </td>
        <td>
            @item.PublishDate.ToLocalTime()
        </td>
    </tr>
}

</table>

結果はこんな感じ。

image

参考:

Razorの紹介 - ASP.NET向け新ビュー・エンジン - @IT

ASP.NET MVC 3 でも使えるフィード表示ヘルパーを作った 
RSS 2.0/ATOM 1.0フィードを処理するには?[3.5、C#、VB]

MVC3 Razor で LINQ to XML

2011年2月7日

https://uchukamen.wordpress.com/2011/01/30/asp-net-mvc2-%e3%81%a7-linq-to-xml/

で、ASP.NET MVC2 で LINQ to XML をしてみたが、今回はMVC3 Razor で LINQ to XMLしてみる。

1. MVC3 の新規プロジェクトを作成。ビューエンジンは Razor

image

2. YahooRssModel.cs をモデルに追加、次のコードを実装。

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

namespace MvcApplication7.Models
{
    public class YahooRssModel
    {
        public string title { get; set; }
        public string link { get; set; }
        public string pubDate { get; set; }
        public string guid { get; set; }
    }
}

3. YahooRssController を追加し、次のコードを実装。

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

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

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

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

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

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

            return View(res);
        }
    }
}

4. ビューを追加。

Views にYahooRss フォルダーを作成し、その中にビューを追加する。そのとき、ビュー名は、Index。ビューエンジンは Razor(CSHTML)、「厳密に型指定されたビューを作成する」にチェック。モデルクラスのドロップダウンリストより、モデルクラスに追加した YahooRssModel を追加。スキャフォールディング・ビュー・テンプレートは、List を選択。

image

http://…/YahooRss/ をリストすると次のような一覧表示が作成される。もとはLINQデータなので、Create, Edit, Delete は対応できないので、次のコードを削除する。

<p>
    @Html.ActionLink(“Create New”, “Create”)
</p>

<th></th>

<td>
    @Html.ActionLink(“Edit”, “Edit”, new { /* id=item.PrimaryKey */ }) |
    @Html.ActionLink(“Details”, “Details”, new { /* id=item.PrimaryKey */ }) |
    @Html.ActionLink(“Delete”, “Delete”, new { /* id=item.PrimaryKey */ })
</td>

以上で、次の簡単なリスト表示ができる。

image

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

2011年2月6日

 

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

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

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

}

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

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

index.cshtmlで、

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

とする。

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

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

image