Archive for the ‘ASP.NET’ Category

machineKey

2013年3月31日

次のエラーが発生している場合、

<machineKey> 構成が同一の validationKey および検証アルゴリズムを指定していることを確認してください。AutoGenerate をクラスターで使用することはできません。

web from での VIEWSTATE の検証キーを生成する際に使用している machineKey がweb farm構成などの影響により一致しなくなっている可能性がある。

 

machineKey はこちら。

MSDN machineKey

 

ViewStateの検証に関しては、次がわかりやすい。

Webアプリケーションの状態管理

 

対処方法は、

machineKey を生成する方法

で紹介されている次の方法が便利。

Online tool to create keys for view state validation and encryption

アクセス許可で禁じられた方法でソケットにアクセスしようとしました。

2013年3月6日

次のエラーが発生しました。

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

アクセス許可で禁じられた方法でソケットにアクセスしようとしました。

原因は、McAfeeで、大量スパムのブロックによるもので、

例外として、IIS Worker Process の  W3wp.exe を登録することにより解決。

スマートフォンからのアクセスの判断とWEBレイアウト

2013年1月4日


最近、スマートフォン、Nexus 7の利用頻度が上がっているので、レスポンシブWEBデザイン対応が必要になりつつある。

ゼロから始めるレスポンシブWebデザイン入門

Media Queries

W3C Recommendation 19 June 2012

文系デザイナーでも大丈夫!レスポンシブWEBサイトをWordPressで作ってみよう

スクリーン情報のテストページ   http://uchukamen.com/mobile/screen.html

userAgent(ユーザーエージェント一覧)

方法1 CSS の Media Query

同一のスタイルシートで扱うなら

例; 320画素-479画素まで

@media screen and (min-width: 320px) and (max-width: 479px) { … }

@media only screen and (min-device-width : 320px) and (max-device-width : 480px) { … }

方法2 link

スタイルシートを分離するなら

<link rel="stylesheet" media="all and (orientation: portrait)" href="portrait.css">

方法3 userAgent

userAgentで判断

if (navigator.userAgent.indexOf(‘iPhone’) > 0 ||

navigator.userAgent.indexOf(‘iPad’) > 0 ||

navigator.userAgent.indexOf(‘iPod’) > 0 ||

navigator.userAgent.indexOf(‘Android’) > 0) { … }

デバイスの情報

  screen.

width
screen.

height
screen.

availWidth
screen.

availHeight
device

PixelRatio
window.

orientation
PC (ie10) 1920 1080 1920 1040 undefined undefined
Nexus 7 縦 800

縦→横にしても変化しない
1205

縦→横にしても変化しない
800 1205 1.331 0

縦→横にすると90
Nexus 7 横 1280

横→縦にしても変化しない
736

横→縦にしても変化しない
1280 736 1.331 90

横→縦にすると0
Windows Phone 7 縦 480 800 480 800 undefined undefined
Windows Phone 7 横 480 800 480 800 undefined undefined
iPhone 4縦 320 480 320 460 2 0
iPhone 4横 320 480 320 460 2 90
iPhone 4S            
iPhone 5            
Arrows X LTE 縦 1081 1680 D:\Visual Studio Projects\ngensol5\ngensol5\Content\1081 1680 2 0
Arrows X LTE 横 1081 472 1081 472 2 90

iPhone4やiPhone4Sの画面サイズは640×960ですが、3G/3GSとの互換性から、screen.widthの値が320、screen.heightの値が480になっています。これを補正するために、window.devicePixelRatio で補正します。しかし、devicePixelRatio は、Microsoft 系ではサポートされていません。

Media Query時の device-width, width

<meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=2" />

  viewport を指定しない場合 viewport を指定しない場合 viewport を指定 viewport を指定
  device-width width device-width width
windows  phone 7 480 1024 480 320
Nexus 7 600 980 600 600
iPhone 4        
iPad        
         

/* windows phone 7向けCSS*/

@media only screen and (device-width: 480px){…}

/* Nexus 7向けCSS*/

@media only screen and (device-width: 600px){…}

/*iPhone 3向けCSS*/

@media only screen and (max-device-width: 480px) and (-webkit-device-pixel-ratio: 1) {…}

/*iPhone 4向けCSS*/

@media only screen and (max-device-width: 480px) and (-webkit-device-pixel-ratio: 2) {…}

ASP.Net 4.0 Routing

2012年12月30日

Global.aspx.cs に RegisterRoutes を追加。

void Application_Start(object sender, EventArgs e)
{
    // アプリケーションのスタートアップで実行するコードです
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    AuthConfig.RegisterOpenAuth();

    RegisterRoutes(RouteTable.Routes);
}

// これは例です。
void RegisterRoutes(RouteCollection routes)
{
    // Register a route for Categories/All
    routes.MapPageRoute(
       "All Categories",      // Route name
       "Categories/All",      // Route URL
       "~/AllCategories.aspx" // Web page to handle route
    );

    // Route to handle Categories/{CategoryName}.
    // The {*CategoryName} instructs the route to match all content after the first slash, which is needed b/c
    //  some category names contain a slash, as in the category "Meat/Produce"
    // See http://forums.asp.net/p/1417546/3131024.aspx for more information
    routes.MapPageRoute(
       "View Category",               // Route name
       "Categories/{*CategoryName}",  // Route URL
       "~/CategoryProducts.aspx"      // Web page to handle route
    );

    // Register a route for Products/{ProductName}
    routes.MapPageRoute(
       "View Product",           // Route name
       "Products/{ProductName}", // Route URL
       "~/ViewProduct.aspx"      // Web page to handle route
    );

    // Register a route for Products/{ProductName}
    routes.MapPageRoute(
       "View Product2",           // Route name
       "Products/Test/{P1}/{P2}/{P3}", // Route URL
       "~/Test.aspx"      // Web page to handle route
    );
}


CategoryProducts.aspx.cs

/Categories/X1/X2/CategoryName とした場合、
data=”X1/X2/CategoryName”となる。

public partial class CategoryProducts : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var data = Page.RouteData.Values["CategoryName"];
    }
}


Test.aspx.cs

/Products/Test/X1/X2/X3 とした場合、
data=”X1”, data2=”X2”, data3=”X3” となる。

protected void Page_Load(object sender, EventArgs e)
{
    var data = Page.RouteData.Values["P1"];
    var data2 = Page.RouteData.Values["P2"];
    var data3 = Page.RouteData.Values["P3"];
}

MVC3 でページング

2011年3月2日

1. まずは、サンプルデータベース AdventureWorks をインストール。

http://msftdbprodsamples.codeplex.com/releases/view/55926

2. Model に、Contact の Entity Framework の追加

Model を右クリック、新しい項目の追加より、データのADO.NET Enitity Data Model を選択。

モデルに含めるコンテンツで、データベースから生成を選択。テーブルで Contactを選択。

3. Controller

Action として、Contact を追加。

using MvcApplication8.Models;

AdventureWorksEntities ae = new AdventureWorksEntities();

public ActionResult Contact()
{
    ViewBag.Message = “ASP.NET MVC へようこそ”;

    return View(ae.Contact.ToList());
}

4. Viewとして、Contact を追加。

Razorビューエンジンで、スキャフォールディングのListを選択。

このままだと、すべてのページを表示してしまうので、10レコードづつ表示するページングが必要。

そこで、次のようにルーティングを定義して、
routes.MapRoute(
    “Contact”, // ルート名
    “{controller}/{action}/{page}”, // パラメーター付きの URL
    new { controller = “Home”, action = “Contact”, page = 1 } // パラメーターの既定値
);

Contact Action でページを指定してあげる。

public ActionResult Contact(int page)
{
    ViewBag.Message = “ASP.NET MVC へようこそ”;

    var res = (from x in ae.Contact select x).OrderBy(x=>x.FirstName).Skip(page * 10).Take(10);

    return View(res);
}

これで、http://…/Home/Contact/789 で、789ページ目から10人分だけ表示するページング。

image

なお、OrderByしないと、次のエラーになるので、OrderByは必要。

メソッド ‘Skip’ は、LINQ to Entities では並べ替え済みの入力に対してのみサポートされます。メソッド ‘Skip’ の前にメソッド ‘OrderBy’ を呼び出す必要があります。

なお、Paging performance with Skip/Take

http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/45a9172b-c2fe-4be5-b36b-9ec708f0998e

によると、Linq の Skip / Take はかなり早いようだ。

モデルの概要~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 }});

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);  

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