ちゃこ Blog

ちゃこ の迷い事

AILight Banner
AILight Blog

プロフィール

ちゃこ Blog
ASP.NETとDBのオープン系開発をやってます。

目次

Blog 利用状況

記事分類

過去の記事

タグ

2011年6月15日 #

ASP.NET MVCでの画面遷移Server.Transferについて

仕事でちょっと引っかかったことをちょっと試してみたよ!!
ASP.NETでのURLについてなんだけど・・・
以前、大先生にURLは大事なんだって力説されたことを帰りながら思い出してちょっと早起きして、サンプルを作ってみた。
ASP.NETの場合だとURLから別ページに移動する場合、Response.RedirectとServer.Transferがあると思われる。
違いを自身をもって言えないところがあるんだけれど・・・
Response.Redirectは、サーバにリクエストが入ってレスポンスが戻って再度リクエストが入ってくる。
POSTでリダイレクトは出来ない。
Server.Transferは、サーバにリクエストが入って、レスポンスを返さないで別のURLへリクエストへはいる
間違っていたら、怒られそうで怖い。こんな感じ的な表現でダメだなぁ~~~。かっこいい説明方法が知りたいなぁ。

仕事で、ポップアップを複数出しながら、選択させる画面を作っていて、A-B-Cと3画面あるとする。
A画面は、使う人によっては選択肢が1つしかなく、B画面を表示させる上で必須項目となる。こんな場合にA画面を選択させることを飛ばしたい。って要望があった。
入力を行うので、A-B-CともにPOSTで同一Modelデータを受け渡しながら各項目を埋めていきたい。
そこで、A画面を表示するためのActionメソッドを呼び出し、選択肢が1つのみの場合Modelの値を更新して、B画面へRedirectするようにすることなった。
しかし、やり始めるとうまくいかないので・・・Redirectで入ってくるのはGet側のActionになる。そうなるよねーーー。
それは望んていないのでダメだろうってことになり。ポカーンってなりつつ、MVCでServer.Transferはどうやるんだぁ?ってちょっと悩みつつ
別件でじたばた、また中途半端な感じに・・・

最近早起きな自分は、朝から実験してみた。 下記のサイトを参考にして、
http://stackoverflow.com/questions/799511/how-to-simulate-server-transfer-in-asp-net-mvc
ちょっと考え方を改めて・・・
B画面にリクエストをB画面にて条件となる値が入っているかいないか判定してAに移動するのかBのViewをだすのかを判定するようにしてみた。
考え方はあっているのだろうか?

・Controllerはこんな感じ。

public partial class TransferTestController : Controller
{
    
    public virtual ActionResult Index()
    {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public virtual ActionResult PlaceSelect()
    {
       return View(MVC.TransferTest.Views.PlaceSelect );
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public virtual ActionResult PlaceSelect(TestModel model)
    {
        return View(MVC.TransferTest.Views.PlaceSelect,model);
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public virtual ActionResult Test(string placeName)
    {
        if (string.IsNullOrEmpty(placeName))
        {
            return new MVCTransferResult(MVC.TransferTest.PlaceSelect(new TestModel()));
        }
        else
        {
            return View(MVC.TransferTest.Views.Test, new TestModel { BirthPlace = placeName });
        }
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public virtual ActionResult Test(TestModel model)
    {
        if (string.IsNullOrEmpty(model.BirthPlace))
        {
            return new MVCTransferResult(MVC.TransferTest.PlaceSelect(model));
        }
        else
        {
            return View(MVC.TransferTest.Views.Test,model );
        }

    }

    public virtual ActionResult confirm(TestModel model)
    {
        return View(MVC.TransferTest.Views.confirm,model);
    }
}

動かしてみると、期待道理になるっている気がする。
もう少しきちんと動かさないと・・・・

ずいぶん、時間がたってしまったが、その後アプリ側で使用した。デプロイ後に動かない?ってなったので追記します

MVCTransferResultは、http://stackoverflow.com/questions/799511/how-to-simulate-server-transfer-in-asp-net-mvc を利用させてもらった。

IIS上で動かすとExecuteResultにてHttpRuntime.UsingIntegratedPipelineはTrueになりデプロイ後にうまく動かすことが出来なかった。

 

posted @ 7:18 | Comment (2)

2011年6月12日 #

久しぶりにASP.NET MVC ブートキャンプに参加した。

久しぶりに記事をアップしようかと・・・たぶん続けられないです。
ASP.NET MVC ブートキャンプに参加してちょっと学習モード。
仕事で、ASP.NET MVC+EntityFrameworkの組み合わせでコンシュウマー向けサイトとサービス提供サイトを作ってます。
カンファレンス聞きながら、Razorとかの冊子を読んでいたんです。Razorは使っていたんだけど・・・
特に、MVCControlsToolkitを利用していなかった。詳細表示とかすごく楽ちんなのと、テンプレートが利用できるのはえらく楽ちん。
IBindingsBuilderやClientTemplateHelperの存在を知っていればって全然違う実装になったところがある。知らないって本当にダメですね。
覚書として、コードを貼っておこうと思います。


ASP.NET MVCの場合、Controllerでリクエストを受け付けレスポンスを返す。
一覧データを表示する場合は下記みたいになる。
・Controller

public class HomeController : Controller
{
       public ActionResult Index()
        {
            //表示に必要なモデルを生成する。
            var model = new HomeViewModel(); 
            return View(model); //←/Views/Home/index.cshtmlを返却する。
        }
}
◎MVCControlsToolkitを使わない場合はこんな感じ
・View
@model HomeViewModel
@{
    var grid = new WebGrid(Model);
}
<!DOCTYPE html >
<head>
     <title>Index</title>
     <style type ="text/css" >
         .grid {margin : 2px; border-collapse:collapse ; width : 300px;}
	 .head {background-color:Blue;}
	 .grid ht, grid td {border:1px solid #C0C0C0;padding:5px;}
	 .alt { background-color:Blue;color:#000;}
     </style>
</head>
	
 <body>
	@using (Html.BeginForm("Index", "Home"))
	{
	<h2>データ表示</h2>
	<div>

             @grid.GetHtml(
	       tableStyle :"grid",
	       headerStyle:"head",
	       alternatingRowStyle:"alt",
	       columns :grid.Columns(
	          grid.Column("Name","名前",canSort:true),
	          grid.Column("Tel","電話番号",canSort:true),
	          grid.Column("Mail","メール",canSort:true)))
	</div>
	}

</body>

◎MVCControlsToolkitをつかった場合はこんな感じ。(書いただけでうごかしていない。)



@model Mvc_Examples.Models.HomeViewModel
@using Mvc_Examples.Models;
@using MVCControlsToolkit.Core;
@using MVCControlsToolkit.Controls;
@using MVCControlsToolkit.Controls.Bindings;
<!DOCTYPE html >
<head>
    <title>Index</title>
</head>
<body>
    <h2>データ表示</h2>
@using (Html.BeginForm("Index", "Home"))
{
    <div>
        @{
           var clientModel = Html.SAClientViewModel("homeClientView", Model);
           var tBinding = clientModel.Template("homeViewTemplate", m => m.List).Get();
           var sumbitButtonBindings = clientModel.Click(m => m, "submitProductsChosen").Get();
        }
        <table>
            <thead>
                <tr>
                    <td>
                        <strong>名前</strong>
                    </td>
                    <td>
                        <strong>電話</strong>
                    </td>
                    <td>
                        <strong>メール</strong>
                    </td>
                </tr>
            </thead>
            <tbody data-bind="@tBinding" id="provaScript">
            </tbody>
        </table>
        @{
            var template = Html.ClientTemplate<HomeView>("homeViewTemplate",_S.H<HomeView>(
            @<tr>
                <td>
                    @item.DisplayFor(m => m.Name)
                </td>
                <td>
                    @item.DisplayFor(m => m.Tel)
                </td>
                <td>
                    @item.DisplayFor(m => m.Mail)
                </td>
                <td>
                    @item.DetailLink(Ajax, "Edit Details", DetailType.Edit, "Details", "Home",
                                    new { id = item.ViewData.Model.Id }, null)
 
                </td>
            </tr>
                ));
        }
        @template
        @clientModel.HandleServerErrors()
        <input type="button" value="Submit" data-bind='@sumbitButtonBindings'/>
    </div>
}
@{ 
    Html.DetailFormFor(Ajax, m => m.Lists, ExternalContainerType.div,
        "Details", "Home", null, "isChangedItem", "isDeletedItem", 
        detailDialog:
        new MVCControlsToolkit.Controls.DataGrid.Dialog
        {
            Title = "prova dialogo",
            Show = "slide",
            Hide = "slide",
            MinWidth=800
 
        });
}
<//body>
 
DBから取得してやる場合は、こんな感じ!!
Database.Open("XX");
var data=db.Query("Select * From AAA ORDER BY Name");
var grid = new WebGrid(source:data,defaultSort:"Name",rowsPerPage:10);

 

posted @ 5:55 | Comment (2)

2005年10月29日 #

PASSJアフタースクール SQLServerセキュリティ講座へ参加して・・・

すごく書込みをサボっていました。ごめんなさい。
本当はこっそり聞いて自分自身が納得するつもりだったのと、どんな風に解説するのかが興味があり参加申込をしたつもりだったが、申込が出来ていなかったようで・・・兄の名前を使って入れてもらいました。
兄上いつもどじな妹で許してくだされ・・・

3000円の受講料でと考えるとすごく安いと感じました。たぶん、本来は何万もするものだと思います。
色々な技術発展の歴史とそれに伴う問題点と改良点についてが1時間ぐらいあり・・・
現状のIISとSQLServerの組み合わせの説明があり・・・
セキュア・プログラミングの話とデモがあり・・・
実際環境があったらもっと面白いだろうなぁって思いました。
仕事としてシステムに関わる人はきちんと理解して意識してシステム構築をしてほしいと思う事柄が集約された講座でした。3時間半の講座でしたが、大変大変有意義でした。

posted @ 22:09 | Comment (1)

2005年7月26日 #

スマート クライアントサンプルを眺めて見る。

ノータッチ デプロイメントみたいな仕事を4月から今月頭までやってきて・・・かなり暇になった。
情報収集中によく出てきたスマートクライアントについて試してみようと思う。
まずは、スマートクライアント基本情報を熟読(http://www.microsoft.com/japan/msdn/smartclient/technologyinfo/default.aspx) 
サンプルもあったので拾ってくる(http://www.microsoft.com/japan/msdn/smartclient/samples/
拾ってきて、VB.NETで書かれているので、C#で書くことにした。
意気込みだけで終わってしまわないようにしなければ・・・

posted @ 13:23 | Comment (0)

2005年6月29日 #

InitializeComponentも見て欲しいとぼやいていると思う

今の仕事でも開発者向けマニュアルにInitializeComponentは触れてはいけませんと
堂々と書かれているが、本当にそうなのだろうか?
分けも分からず、修正するとデザインで表示できなくなることもあるからだろう。

デザインでは設定できるけど、動的に作る事が出来ないという前にデザインした際に
InitializeComponentの中でどの様に書かれているかを是非確認して欲しい。
参考に出来るコードは既にあるのだから・・・

posted @ 0:38 | Comment (7)

2005年6月25日 #

お世話になります。

Blogにデビューしちゃいました。ちゃこです。
お世話になります。よろしくお願いします。
掲示板にもほとんど書込みもせず、常にギャラリーの私を許して欲しかったのに、兄の地雷を踏んでしまいました。寝ぼけてWebチェックしていたら、やってしまいました。(>-<)
人のディスクをあさってばかりいないで自分でもなんかしろよーーーって事なんだと反省しています。
考えてみれば、.NETとのお付き合いも2年が過ぎようとしています。2年間で何か成長したのか疑問です。
自分自身が日々ぶち当たるどうすれば良いの?とかを中心的に書いていこうと思います。
皆さんの参考になるような立派な事を書く自身はありませんが頑張っていこうと思います。

posted @ 14:36 | Comment (3)