ID登録せずに、無料で質問できる♪ 教えて!gooアプリ>>

マスターページとコンテンツページ(aspxファイル)のディレクトリ階層が異なる場合、マスターページにJavaScriptファイルの指定を行うと、生成された画面のソースを見ると、マスターページからの相対パスになっており、JavaScriptのメソッドを実行できません。
どうすれば、コンテンツページからのパスで生成されるようにできますか?
■階層
root
┗Script
___Script.js
┗マスターページ
___マスターページ.master
┗コンテンツルート
_┗aspxファイル
______コンテンツ.aspx
■マスターページ
<head id="Head1" runat="server">
<script type="text/javascript" src="~/Script/Script.js" charset="Shift_JIS"></script>
</head>
■生成されたhtml
<head id="Head1" runat="server">
<script type="text/javascript" src="../Script/Script.js" charset="Shift_JIS"></script>
</head>
希望しているコード
<script type="text/javascript" src="../../Script/Script.js" charset="Shift_JIS"></script>

このQ&Aに関連する最新のQ&A

A 回答 (1件)

ASP.NET 2.0で同じようなページ構造にして試してみましたが、相対パスどころか"~/Script..."がそのままブラウザに送られてきました…。


scriptタグはパス変換の対象になっていない様子。
(このあたりは設定等で変更できるかもしれませんが調べてません。)

解決策としては、マスターページのInitイベントでヘッダにscriptタグを追加する方法があります。

VBの場合:
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
Dim tagScript As New HtmlControls.HtmlGenericControl("script")
tagScript.Attributes.Add("type", "text/javascript")
tagScript.Attributes.Add("src", Me.ResolveClientUrl("~/Script/Script.js"))
tagScript.Attributes.Add("charset", "Shift_JIS")
Me.Page.Header.Controls.Add(tagScript)
End Sub

C#の場合:
私はC#書けないので上記コードからC#用に書き換えてください。
    • good
    • 0
この回答へのお礼

ありがとうございました。
教えていただいた方法を参考に
<script type="text/javascript" src='<%= Me.ResolveClientUrl("~/Script/Script.js") %>' charset="Shift_JIS"></script>

マスターページからのパスではなくコンテンツページからのパスで表示することができました。
C# なので Me ではなく、this にしました。

お礼日時:2009/05/21 00:29

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qマスターページ使用時のJavascript

vs2012 c#で作成しています。
下記のjavascriptをマスターページを使用したContentPlaceHolderID何に記述し、
playボタンを押すと、再生されません。
(正確には再生直後にリロードが発生しているように見えます)
通常のhtmlページでhead内に書くと問題なく再生できるのですが、
なぜこうなるのか教えて下さい。


<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage2.master" AutoEventWireup="true" CodeFile="test3.aspx.cs" Inherits="test3" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolderContent" Runat="Server">

<div>
<input id="file" name="file" type="file" onchange="preview()" class="form-control" />
</div>

<div class="flex-video widescreen" style="margin: 0 auto; text-align: center;">
<video id="video" class="videoUiWrapper thumbnail" controls loop muted preload="auto" ></video>
</div>

<div>
<button id="btnPlay" onclick="playVideo()" class="btn btn-primary">play</button>
<button id="btnPause" onclick="pauseVideo()" class="btn btn-primary" >pause</button>
</div>

<script type="text/javascript">

function preview() {
var fileData = document.getElementById("file").files[0];
if (fileData.name != "") {
tryVideo(fileData);
}
}

function tryVideo(file) {
if (!/video/.test(file.type)) {
return alert('videoぢゃない');
}
if (!/probably|maybe/.test(video.canPlayType(file.type))) {
return alert('再生できる動画ファイルぢゃないyo');
}
video.src = URL.createObjectURL(file);
}

function playVideo() {
video.play();
}

function pauseVideo() {
video.pause();
}

</script>

</asp:Content>

vs2012 c#で作成しています。
下記のjavascriptをマスターページを使用したContentPlaceHolderID何に記述し、
playボタンを押すと、再生されません。
(正確には再生直後にリロードが発生しているように見えます)
通常のhtmlページでhead内に書くと問題なく再生できるのですが、
なぜこうなるのか教えて下さい。


<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage2.master" AutoEventWireup="true" CodeFile="test3.aspx.cs" Inherits="test3" %>

<asp:Content ID="Content1" ContentPlaceHolder...続きを読む

Aベストアンサー

えーと、
対応する MasterPage の ConetntPlaceHolder がどの位置にあるのか不明ですが、<body></body>内部にあるのであれば、ブラウザによってはスコアの高い js が順次解釈となって、関数定義の順序が問題になることがあるかもしれません。

関数定義をリテラルにして、明示的に宣言順を明確にするか、<head> 部に ContentPlaceHolder を作って、<script> 部分を全部そちらに移すのがいいと思いますが。

<head>
<title>
<asp:ContentPlaceHolder runat="server" id="PH_Title" />
</title>
<asp:ContentPlaceHolder runat="server" id="PH_Head" />
</head>
<body>
<asp:ContentPlaceHolder runat="server" id="PH_Main" />
</body>

Q【ASP.NET】マスターページに配置されたボタンのイベントを拾いたい

※こちらの派生です。
http://oshiete1.goo.ne.jp/qa5222698.html

マスターページに配置したボタンのクリックイベントを
コンテンツページ(?マスターページを使用するページ)で
拾うことは可能でしょうか?

もしくは、マスターページに配置したボタンのクリックイベントの処理を
コンテンツページで実装することは可能でしょうか?

ボタンの配置は同じだけれど、メソッドの中の処理は
コンテンツページ毎に分けたいのです。


例えばマスターページ「hoge」とコンテンツページ「moge」があったとすると
以下のような感じです…。

---------------------------------------------------------------------------
==============
hoge.Master
==============
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="hoge.master.cs" Inherits="xxx.hoge" %>

<asp:Content ID="Content3" ContentPlaceHolderID="FooterContentPlaceHolder" runat="server">
<asp:Button ID="btn" runat="server" Text="ぼたん" onclick="btn_Click" />
</asp:Content>

==============
hoge.Master.cs
==============
protected void btn_Click(object sender, EventArgs e)
{
// ここではなく
}

==============
moge.aspx
==============
<%@ Page Language="C#" MasterPageFile="~/hoge.Master" AutoEventWireup="true" CodeBehind="moge.aspx.cs" Inherits="xxx.moge" Title="もげ" %>

==============
moge.aspx.cs
==============
protected void btn_Click(object sender, EventArgs e)
{
// ここにボタンが押された際の処理を実装したい
}
---------------------------------------------------------------------------

よろしくお願い致します。

※こちらの派生です。
http://oshiete1.goo.ne.jp/qa5222698.html

マスターページに配置したボタンのクリックイベントを
コンテンツページ(?マスターページを使用するページ)で
拾うことは可能でしょうか?

もしくは、マスターページに配置したボタンのクリックイベントの処理を
コンテンツページで実装することは可能でしょうか?

ボタンの配置は同じだけれど、メソッドの中の処理は
コンテンツページ毎に分けたいのです。


例えばマスターページ「hoge」とコンテンツページ「moge」があったと...続きを読む

Aベストアンサー

質問内容が間違っていると指摘しましたが、恐らく下記のようなことをやりたいんじゃないかと思い、推測で答えを書いてみました。
ご確認ください。

==============
hoge.Master
==============
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="hoge.master.cs" Inherits="MasterPage" %>

<asp:contentplaceholder id="FooterContentPlaceHolder" runat="server">
<%-- ここにaspxのコンテンツをaspxファイルで配置してもらう --%>
</asp:contentplaceholder>

<%-- MasterPage に配置したボタン--%>
<asp:Button ID="btn" runat="server" Text="ぼたん" />

==============
hoge.Master.cs
==============
public partial class MasterPage : System.Web.UI.MasterPage
{
  // aspx側に公開するボタンのクリックイベント
  public EventHandler btnClick_PageHandler;

  // MasterPage表示時
  protected void Page_Load(object sender, EventArgs e)
  {
    // aspx側で処理するボタンのクリックイベントが設定されていたら
    if (btnClick_PageHandler != null)
    {
      // aspx側で定義したボタンクリックイベントを設定する
      btn.Click += btnClick_PageHandler;
    }
  }
}

==============
moge.aspx
==============
<%@ Page Language="C#" MasterPageFile="~/hoge.Master" AutoEventWireup="true" CodeBehind="moge.aspx.cs" Inherits="xxx.moge" Title="もげ" %>

==============
moge.aspx.cs
==============
protected void Page_Init(object sender, EventArgs e)
{
  // MasterPageのインスタンスを取得する
  ASP.hoge_master m = (ASP.hoge_master)this.Master;

  // MasterPageにあるボタンにクリックイベントを付与する
  m.btnClick_PageHandler += new EventHandler(this.MasterPageButton_Click);
}

private void MasterPageButton_Click(object sender, EventArgs e)
{
  // ここにMasterPageで定義したボタンのクリックイベントを実装する
}

もし、質問したかった内容と回答内容が違うようであれば、もう一度、情報を整理してご質問頂けるとた有難いです。
宜しくお願いします。

質問内容が間違っていると指摘しましたが、恐らく下記のようなことをやりたいんじゃないかと思い、推測で答えを書いてみました。
ご確認ください。

==============
hoge.Master
==============
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="hoge.master.cs" Inherits="MasterPage" %>

<asp:contentplaceholder id="FooterContentPlaceHolder" runat="server">
<%-- ここにaspxのコンテンツをaspxファイルで配置してもらう --%>
</asp:contentplaceholder>

<%-- MasterPage に...続きを読む

QASP.NET(VB)VBソースからJavascriptの関数を呼ぶには

お世話になります。
asp.netのVBソースからJavaScriptの関数を呼ぶ方法を知りたいのですがお分かりになる方、教えてください。

Aベストアンサー

えーっと、
サーバーサイドのVB.NETから
クライアントサイドのJavaScriptですか?

まっとうな方法じゃムリですよ。
敢えてやるとすれば、Form の OnLoad にJavaScript 呼び出しを仕込むとか。

QASPで画面間のパラメタ受け渡し

こんばんは。ASP初心者です。
ASPでWEBページの作成を行っています。画面遷移をResponse.Redirect()で行っているのですが、遷移前のページと遷移後のページでパラメタを受け渡したい場合はSession("hoge") = "hogehoge"のようにセッションに入れる以外、何か方法はないでしょうか。リクエスト間でパラメタ渡せればがいいので、セッションを通じて保持しておく必要がないのです。クエリを使用するとアドレス欄に変数の値が見えてしまうのでできれば使いたくありません。

Aベストアンサー

1. Cookieを使う
2. 画面遷移を postで行い、hidden項目に値をセットする (要JavaScript)

私は面倒なのでセッション変数使ってますが、必要なくなればセッションをクリアすれば良いだけだと思います。

Session.Contents("hoge") = Empty

QページにJavaScriptを埋め込むには?

いつもお世話になっております。
ASP.NETでWebを作っております。
ボタン押下時に確認メッセージを出したく思っております。
まず考えたのが.aspxのボタンの場所にOnClientClickに記述したのですが.csのボタン押下処理(DB更新)より.aspxのボタン押下処理の方が早く出てしまいました。
次に.csにJavaScriptを埋め込むことにしました
参照:http://www.atmarkit.co.jp/fdotnet/dotnettips/160regscript/regscript.html
がしかしRegisterClientScriptBlockなどは古い形式です。警告が出てしまいます。
引数がよくないみたいなんですがどなたかわかる方ご教授お願いいたします。

Aベストアンサー

お世話になります。

.NET Framework のバージョンは書いてませんが 2.0 ですよね、きっと。
何を使うべきかは警告メッセージの後ろに書いてあります。
[警告メッセージより引用]
'System.Web.UI.Page.RegisterClientScriptBlock(string, string)' は古い形式です: 'The recommended alternative is ClientScript.RegisterClientScriptBlock(Type type, string key, string script). http://go.microsoft.com/fwlink/?linkid=14202'
[/警告メッセージより引用]

パラメータとして何を渡すべきかは MSDN に書いてあります。
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.clientscriptmanager.registerclientscriptblock(VS.80).aspx
[MSDN より引用]
パラメータ
type
登録するクライアント スクリプトの型。
key
登録するクライアント スクリプトのキー。
script
登録するクライアント スクリプト リテラル。

解説
クライアント スクリプトは、そのキーと型で一意に識別されます。同じキーと型を持つスクリプトは重複していると見なされます。同じ型とキーのペアを持つスクリプトは、同じページに 1 つだけ登録できます。既に登録されているスクリプトを登録しようとしても、重複したスクリプトは作成されません。
[/MSDN より引用]

なので、こんな感じになると思います。
RegisterClientScriptBlock("startup", "<script language='JavaScript'> alert('スタートアップ') </script>")

ClientScript.RegisterClientScriptBlock(this.GetType(), "startup", "<script language='JavaScript'> alert('スタートアップ') </script>")

お世話になります。

.NET Framework のバージョンは書いてませんが 2.0 ですよね、きっと。
何を使うべきかは警告メッセージの後ろに書いてあります。
[警告メッセージより引用]
'System.Web.UI.Page.RegisterClientScriptBlock(string, string)' は古い形式です: 'The recommended alternative is ClientScript.RegisterClientScriptBlock(Type type, string key, string script). http://go.microsoft.com/fwlink/?linkid=14202'
[/警告メッセージより引用]

パラメータとして何を渡すべきかは MSDN に...続きを読む

Qマスターページからコンテンツページのメソッドを実行したい

お世話になります。
マスターページからコンテンツページのメソッドを実行したいです。
よろしくおねがいします。


**********************************
マスタページ:Site1
**********************************
[Site1.Master]
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="Site1" %>

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>


[Site1.Master.cs]
public partial class Site1 : System.Web.UI.MasterPage
{

ここで、コンテンツページのメソッドを実行

}


**********************************
コンテンツページ:WebForm1
**********************************
[WebForm1.aspx]
<%@ Page Language="C#" MasterPageFile="Site1.Master" Codebehind="WebForm1.aspx.cs" Inherits="WebForm1" %>

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1">
</asp:Content>


[WebForm1.aspx.cs]
public partial class WebForm1 : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
 }

 //このメソッドをマスターページで実行したい
 public string メソッド()
 {
  return "XXXXXXX";
 }

}

お世話になります。
マスターページからコンテンツページのメソッドを実行したいです。
よろしくおねがいします。


**********************************
マスタページ:Site1
**********************************
[Site1.Master]
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="Site1" %>

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>


[Site1.Master.cs]
public partial class Site1 : System.Web...続きを読む

Aベストアンサー

----------
※単純解答
----------
public partial class Site1 : System.Web.UI.MasterPage
{
  protected void Page_Load(object sender, EventArgs e)
  {
    TextBox l_txt = new TextBox();
    l_txt.Text = this.呼出();
    this.Page.Form.Controls.Add(l_txt);
  }

  private string 呼出()
  {
    WebForm1 l_frm = (WebForm1)this.Page;
    return l_frm.メソッド();
  }
}


----------
※別解
----------
マスタを利用するってことは、埋め込むフォームが変わるはずです。

埋め込まれるフォームはベースクラスを利用した作りにして、マスタからのメソッド呼び出しはベースクラスのメソッドを呼ぶと、スマートな作りになると思います。

[childpage.cs]をプロジェクトに新規追加
public class childpage : System.Web.UI.Page
{
  //継承可能なメソッド1
  public virtual string メソッド()
  {
    return "未設定";
  }

  //継承可能なメソッド2
  public virtual string メソッド2()
  {
    return "親です";
  }
}

[WebForm1.aspx.cs]を改造
public partial class WebForm1 : childpage
{
  // このメソッドを省略すると、ベースのメソッドを実行する
  public override string メソッド()
  {
    return "XXXXXXX";
  }

  // おまけ
  public override string メソッド2()
  {
    //親のメソッド2との合わせ技
    return String.Format("親を呼ぶと【{0}】が返る", base.メソッド2());
  }
}

[Site1.Master.cs]も改造 (単純解答を改造)
private string 呼出()
{
  childpage l_frm = (childpage)this.Page;
  return l_frm.メソッド();
}

----------
※単純解答
----------
public partial class Site1 : System.Web.UI.MasterPage
{
  protected void Page_Load(object sender, EventArgs e)
  {
    TextBox l_txt = new TextBox();
    l_txt.Text = this.呼出();
    this.Page.Form.Controls.Add(l_txt);
  }

  private string 呼出()
  {
    WebForm1 l_frm = (WebForm1)this.Page;
    return l_frm.メソッド();
  }
}


----------
※別解
----------
マスタを利用するってことは、埋め込むフォームが変わる...続きを読む

Qasp.netでtextboxの値を取得

ASP.net Webフォームで質問です(VS2012)


ASP.netのTextBoxコントロールではなく、HTMLのtextboxの値を取得することは可能でしょうか。

また、textboxが複数あった場合でも、全てを取得したいのですが、

textboxがいくつあるか、その全てを取得するにはどのようにすれば良いでしょうか。

Aベストアンサー

<html id="textbox1" type="text" runat="server" value="" />
<textarea id="textarea1" runat="server"></textarea>
などとして、HtmlControlを使用すれば、WebControlと同じように、Valueプロパティで値を取得できますよ。

System.Web.UI.Page.HtmlControls 名前空間には、全てのHTML要素に対応した、HtmlControl が収容されています。

今回の例ですと、
System.Web.UI.HtmlControls.HtmlInputText
System.Web.UI.HtmlControls.HtmlTextArea
あたりになるでしょうか。

取得については、ページ内のコントロールを列挙して、Typeが System.Web.UI.HtmlControls.HtmlInputText なもののValueを取ればいいかと。

ttp://blogs.wankuma.com/ogiogi/archive/2008/02/20/123948.aspx

<html id="textbox1" type="text" runat="server" value="" />
<textarea id="textarea1" runat="server"></textarea>
などとして、HtmlControlを使用すれば、WebControlと同じように、Valueプロパティで値を取得できますよ。

System.Web.UI.Page.HtmlControls 名前空間には、全てのHTML要素に対応した、HtmlControl が収容されています。

今回の例ですと、
System.Web.UI.HtmlControls.HtmlInputText
System.Web.UI.HtmlControls.HtmlTextArea
あたりになるでしょうか。

取得については、ページ内のコントロー...続きを読む

QASP.NETで使用しているJavascriptが動作しない

内部記述のJavascriptは正常(エラーなし)に動作するのですが、外部参照式にすると、エラー(オブジェクトを指定してくださいなど・・・)が発生してしまいます。

上記は全く同じ内容のソースで検証しました。

【正常に動いた場合】
<Script langage="Javascript">
function TestSub(prm){

}
</Script>

【異常終了した場合】
<Script Src="Common.js" langage="Javascript"></Script>
エラー内容「オブジェクトを指定してください」他

リンクパスには問題ありませんでした。
情報不足の場合は随時更新いたします。
よろしくお願いします。

Aベストアンサー

VS.NETを使ってあるのであれば、クライアントスクリプトを簡単にデバッグできます。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vsdebug/html/vxtskDebuggingClient-SideScript.asp

外部javascriptファイルをプロジェクトに登録してブレークポイントを置くことも出来ます。

>エラー内容「オブジェクトを指定してください」

スクリプトに問題ないとしら、文字化けしているとか。

<Script Src="Common.js" langage="Javascript" charset="SHIFT_JIS"></Script>

QJavaScriptde途中で、「exit」するには?

function kensaku(){
s_data = document.kaiin_form.input_name.value;

if(!s_data){ alert("キーワードを入れて下さい!"); }

if(s_data != dumy){ ...... }
for(i=st_no;i<=n;i++){
......省略.................;
.......省略................}
}

----------------------------------
3行目で表示されたアラートをOKで閉じても、4行目以下が実行されてしまいます。
3行目でexitするにはどうすれば良いでしょうか?

Aベストアンサー

>関数(kensaku())からは抜けられませんでした。
そうですね、勘違いしていました、f(^^;
すみません。
if(!s_data){
alert("キーワードを入れて下さい!");
return;
}
ですね。

QButtonの処理について

aspのButtonの処理をクライアント側(javascript)だけで実行出来ますか?
出来る場合、どのような記述をすればいいでしょうか?

<asp:Button ID="btnHenko" runat="server" Text="実行" OnClientClick=" btn_Click" UseSubmitBehavior="false"
だけ記述したところ、サーバー側の処理が走ってしまいます。

Aベストアンサー

その状態で作成したページを実行した時のソースを良くみてみましょう

OnClick属性に"btn_Click;__doPostBack('btnHenko','');" となっているはずです

btn_Clickを実行してから ___doPostBack('btnHenko','')を実行しますので サーバー側へのPostBackが発生します

クライアントサイドだけの実行にとどめたいのであれば
OnClientClickプロパティに return btn_Click(); と設定して
ページのaspxファイルのheadタグ内などに
<script type="text/javascript">
<!--
  function btn_Click()
  {
    // 何かのクライアント側処理
    return false;
  }
  //-->
</sript>
といった記述が必要です

単純にクライアント側の操作がしたいだけなら ツールボックスのHTMLタブの『Input(Button)』を使った方が確実ですよ

その状態で作成したページを実行した時のソースを良くみてみましょう

OnClick属性に"btn_Click;__doPostBack('btnHenko','');" となっているはずです

btn_Clickを実行してから ___doPostBack('btnHenko','')を実行しますので サーバー側へのPostBackが発生します

クライアントサイドだけの実行にとどめたいのであれば
OnClientClickプロパティに return btn_Click(); と設定して
ページのaspxファイルのheadタグ内などに
<script type="text/javascript">
<!--
  function btn_Click()
  {
...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング