メリット
- SQL Serverが稼働していれば、データ抽出が楽。
- ActiveDirectoryで認証できるハズ。
- WindowsLiveWriterで編集できる。
参考サイト

- まずDBをBlogEngineという名前で用意する
- \BlogEngine.Web\setup\SQLServer内にあるMSSQLSetup1.5.0.0.sqlを実行し必要なテーブルを作成
- BlogEngine(例)というユーザーを作成し、必要が権限を与える。
- \BlogEngine.Web\setup\SQLServer内にあるSQLServerWeb.Configを参考にWeb.configを修正する。
ActiveDirectoryでのユーザー認証はBlogEngineでActiveDirectory認証を参考にしたがうまく行かず。SQL Serverを利用するようにした設定とうまくかみ合ってないのかも。
JavaScript上で扱うIDが自動生成となる為、ID指定部分をサーバー上で生成する必要がある。
test.aspx (変更前)
<A href="Javascript:TestProc(document.forms[0].textBox1.value, ‘AAAA’)" />
↓
test.aspx (変更後)
<A href="#" id="alnk1" runat="server"/>
test.aspx.vb
(フォームロードあたりで)
Me.alnk.HRef = ("Javascript:TestProc(document.forms[0]." & textBox1.ClientID & ".value, ‘AAAA’)"
※String.Formatを使った方が良いです。あくまでサンプルという事で。JavaでOpenしたWindowから制御させるには、Open時にオブジェクト名を渡してスクリプト生成。
FindControl("TextBox1") → Master.FindControl("コンテンツID").FindControl("TextBox1")
秀丸などで、文字のエンコーディングをShift-JISなどからUTF-8へ*.aspxファイルを変更するとそれまで正常に表示できていたページも文字化けする。
原因は、BOMデータが無くなる為。Diffを見ると先頭行で相違が出る。テキストエディタがBOM対応していると違いが判らないのでちょっとハマった。

解決方法は、メモ帳で開いて上書き保存するだけ。
PostBackが発生するのが嫌で、JavaScriptで処理したかったのでメモ。結局、Radioボタンで処理する事にして使わなかったけど。
サーバーにてJavaScriptのソースを生成するにあたって、使用したいDataBind内の列はとりあえずBoundFieldで作っておいて、RowDataBoundイベントで非表示にすればよさげ。
VB.NETの2008です。
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
Dim gvr As GridViewRow = e.Row
If e.Row.RowType = DataControlRowType.DataRow Then
Dim clickEvent As String = String.Format("SetPreview(this,'{0}')", e.Row.Cells.Item(2).Text)
gvr.Attributes.Add("onClick", clickEvent)
End If
e.Row.Cells.Item(2).Visible = False
End Sub
Windows7&Visual Stuido 2005という環境でWebサイトを ASP.NET開発サーバー(VS2005から組み込まれている開発用のhttpd)経由で起動させてみると、Webサーバーが応答せず下記の画面で止まってしまう。
※Vista&VS2005もしくはXP&VS2005という組み合わせでは正常に動作するプロジェクトです。

ふとweb.configのidentityタグで実行ユーザーを指定していた事に気がついた為、ためしに削除してみると・・・起動した。よくわからないけど、ASP.NET開発サーバーが実行ユーザーが指定されるとうまく稼働しない場合がある模様。

ちなみにVS2008でも同じ現象が発生しました。
今までVisualStudio2003で1つのWebプロジェクトだったものを、VisualStudio2005へ手動でアップグレードすると共に2つのプロジェクトへ分割してみた。
すると、それまで気になっていなかった認証処理が各プロジェクト内で必要になり、仕方なくCookieを使う事に。またCookieがあれば自動でログインするにはどうすればいいか考えた結果、Login用のWebページのPage_LoadイベントにてFormsAuthentication.RedirectFromLoginPageを使えば問題ないみたい。
Loginコントロールを使っていたので、Authenticateイベントをコールバックしないといけない?と思ったが不要だった。
Login.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ログイン</title>
</head>
<body>
<form id="login" method="post" runat="server">
<asp:Login ID="Login1" runat="server" BackColor="#F7F6F3" BorderColor="#E6E2D8" BorderPadding="4"
BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana" Font-Size="0.8em"
ForeColor="#333333" DisplayRememberMe="False" OnAuthenticate="Login1_Authenticate">
<TextBoxStyle Font-Size="0.8em" />
<LoginButtonStyle BackColor="#FFFBFF" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px"
Font-Names="Verdana" Font-Size="0.8em" ForeColor="#284775" />
<InstructionTextStyle Font-Italic="True" ForeColor="Black" />
<TitleTextStyle BackColor="#5D7B9D" Font-Bold="True" Font-Size="0.9em" ForeColor="White" />
</asp:Login>
</form>
</body>
</html>
Login.aspx.cs
using System;
using System.IO;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 初回表示時の処理
[ここでCookieをチェック。]
if ([Cookieが有効であれば])
{
FormsAuthentication.RedirectFromLoginPage([Cookieに格納されているユーザー名], false);
}
}
}
private void InitializeComponent()
{
}
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
e.Authenticated = false;
if ([カスタム認証処理])
{
// Cookieの発行
HttpCookie co = new HttpCookie([Cookieの格納名]);
[Cookieへユーザー名の格納]
Response.Cookies.Add(co);
e.Authenticated = true;
}
}
}
しかし、昔のソースはいつも書き直したくなってしまい妥協点を見出して作業に取り掛かるまで時間がかかる。
久しぶりにASP.NET2.0でAJAXを使ってみると・・・

arinco.master
ASP:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="arinco.master.cs" Inherits="arinco" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Test</title>
<link rel="stylesheet" href="/styles.css" type="text/css" />
<style type="text/css">BODY { BACKGROUND-IMAGE: url(/img/arinco.gif); BACKGROUND-REPEAT: no-repeat; background-positin: Left Top }</style>
</head>
<body>
<form id="frmTest" runat="server">
<!-- 中略 -->
</form>
<hr class="Footer" />
</body>
</html>
arinco.master.cs
C#:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Arinco : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
これだとエラーが出るが、
arinco.master.cs
C#:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class arinco : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
こっちはOK。どうも、マスターページのInherits名とマスターページ上のソースでのクラス名が異なると発生する。クラスだから大小文字の違いもだめ。
| arinco.master |
Inherits="arinco" |
|
| arinco.master.cs |
public partial class Arinco : System.Web.UI.MasterPage |
× |
| arinco.master.cs |
public partial class arinco : System.Web.UI.MasterPage |
○ |
ASP.NET AJAXを試験的に導入しているがMaskedEditExtender&MaskedEditValidatorで日付入力を行うとちょっと動作が変。
■パターン1
Mask="9999/99/99"
MaskType="Date"
UserDateFormat="None"
・yyyy/MM/dd形式で正しい日付として認識される。
・ポストバックが発生すると 00dd/yy/yy に変換される
■パターン2
Mask="9999/99/99"
MaskType="Date"
UserDateFormat="YearMonthDay"
・yyyy/MM/ddで入力しても有効な日付と判断されない
困った。ずいぶん悩んだ挙句、苦し紛れに
(続きを読む...)
Visual Studio 2005のマスターページとはいわゆるテンプレートでその中にコンテンツを記入するだけで、サイト全体のアクセス方法やデザインを統一する事ができる。
しかも、SiteMapPathやSiteMapコントロールと組み合わせるとかなり省力化が図れる。
が、各オブジェクトにアクセスする方法がサーバー(C#,VB.NET)とクライアント(JavaScript)で異なる。
どうも、マスターページ内に複数のコンテンツホルダ(CH)が存在する場合にオブジェクトが複数存在する可能性が発生する為、オブジェクトのIDにCHのIDを付与する=クライアントでのIDが変わるという事らしい。
つまり、
efault.aspxで日付を設定する際には日付選択用のdate.aspxを選択して、
default.aspxのTextbox1へ設定する。
という処理が
【ASP.NET】
<img src="button.gif" onClick="JavaScript:Test('Textbox1')">
【ASP.NET2.0】
<img src="button.gif" onClick="JavaScript:Test('[サーバーによっ自動生成]_Textbox1')" />
となり、固定値は保障されない(ClientID)。よってサーバー上でオブジェクトのClientIDを使って
上記のJavaScriptを出力しなければならない。よって
・クライアント側
<ASP:ImageButton ID="ImagaButton1" runat="server" ImageUrl="button.gif" />
・サーバー側
ImageButton1.OnClientClick = String.Format("JavaScript:Test('{0}')",Textbox1.ClientID);
としなくてはならない。orz
ASP.NETでTEST機のファイル一覧を表示させてみた。方法としては
・Dir にて取得
・System.IO.Directory.GetFiles にて取得
で余裕だと思っていた。
すると、Dirはファイル名を返さない場合があるし、GetFilesではログオン失敗とエラーが起きる事がある。しかも再現性が良く判らない。
環境は下記のとおり
・ファイルは実際にASP.NETが稼動しているPC(XXX)とは別のTEST(ファイル格納場所)にある。
・ActiveDirectoryにてドメインを構成したネットワーク下で行っている
今回の対策はひじょーーーーに心苦しいが格納されているファイルの場所をXXXへ移動し、ファイル一覧を表示する際はXXXからローカルパスでアクセスできる場所にし、表示する際にネットワークパスへ置き換えた。これほんと解からん。