2012-03-04 22 views
0

私のコントローラにこのメソッドがあります。 asp.mvcでAjax呼び出しが機能しません

public string GetTime(string zone) 
    { 
     DateTime time = DateTime.UtcNow.AddHours(offsets[zone]); 
     return string.Format("<div>The time in {0} is {1:h:MM:ss tt}</div>", zone.ToUpper(), time); 
    } 

    private Dictionary<string, int> offsets = new Dictionary<string, int> { { "utc", 0 }, { "bst", 1 }, { "mdt", -6 }}; 

この

は私のhtmlです:

@{ 
    ViewBag.Title = "Statistics"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<html> 
<head runat="server"> 
    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" 
    type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" 
    type="text/javascript"></script> 
</head> 
<body> 
    <h2> 
     Statistics</h2> 
    <h2> 
     What time is it?</h2> 
    <p> 
     Show me the time in:<br /> 
     @Ajax.ActionLink("UTC", "GetTime", new { zone = "utc" }, new AjaxOptions { UpdateTargetId = "myResults" })<br /> 
     @Ajax.ActionLink("BST", "GetTime", new { zone = "bst" }, new AjaxOptions { UpdateTargetId = "myResults" }) 
     <br /> 
     @Ajax.ActionLink("MDT", "GetTime", new { zone = "mdt" }, new AjaxOptions { UpdateTargetId = "myResults" }) 
     <br /> 
    </p> 
    <div id="myResults" style="border: 2px dotted red; padding: .5em;"> 
     Results will appear here 
    </div> 
    <p> 
     This page was generated at @DateTime.UtcNow.ToString("h:MM:ss tt") (UTC) 
    </p> 
</body> 
</html> 

問題は時間が(ポストバックがするのではなく、そこにあることを意味空白のページに表示時間element..butのdivに表示されますdoesntのことですajax呼び出し)。なぜそれが起こるのですか?あなたがあなたのunobstrusive jQueryのファイルが含まれていないようだ

<script src="../../Scripts/jquery-1.5.1-vsdoc.js" type="text/javascript"></script> 

<script src="/Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script> 

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script> 

<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> 
+0

戻り値の型として 'ActionResult'を使用し、' Content( "どんな文字列")でも '値を取得しようとします。 – Oybek

+0

このファイルがロードされていることを確認したことがありますか。 – BlackFire27

答えて

1

あなたはレイアウトが含まれているが、あなたのビューでは、あなたが全体<html>文書を持っていると私はあなたが最後にいくつかの非常に壊れたHTMLで終わると仮定します。

はここにあなたのビューでは、レイアウトを使用しない場合のようになります。方法は次のとおりです。

@{ 
    ViewBag.Title = "Statistics"; 
    // Explicitly specify that we don't use any layout because 
    // this view already contains the entire html document 
    Layout = null; 
} 

<html> 
<head> 
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script> 
</head> 
<body> 
    <h2> 
     Statistics</h2> 
    <h2> 
     What time is it?</h2> 
    <p> 
     Show me the time in:<br /> 
     @Ajax.ActionLink("UTC", "GetTime", new { zone = "utc" }, new AjaxOptions { UpdateTargetId = "myResults" })<br /> 
     @Ajax.ActionLink("BST", "GetTime", new { zone = "bst" }, new AjaxOptions { UpdateTargetId = "myResults" }) 
     <br /> 
     @Ajax.ActionLink("MDT", "GetTime", new { zone = "mdt" }, new AjaxOptions { UpdateTargetId = "myResults" }) 
     <br /> 
    </p> 
    <div id="myResults" style="border: 2px dotted red; padding: .5em;"> 
     Results will appear here 
    </div> 
    <p> 
     This page was generated at @DateTime.UtcNow.ToString("h:MM:ss tt") (UTC) 
    </p> 
</body> 
</html> 

スクリプトだけあなたはjqueryjquery.unobtrusive-ajaxである必要があります。また、剃刀にはrunat="server"属性を使用しないでください。

し、レイアウトを使用する場合:

@{ 
    ViewBag.Title = "Statistics"; 
} 

<h2> 
    Statistics</h2> 
<h2> 
    What time is it?</h2> 
<p> 
    Show me the time in:<br /> 
    @Ajax.ActionLink("UTC", "GetTime", new { zone = "utc" }, new AjaxOptions { UpdateTargetId = "myResults" })<br /> 
    @Ajax.ActionLink("BST", "GetTime", new { zone = "bst" }, new AjaxOptions { UpdateTargetId = "myResults" }) 
    <br /> 
    @Ajax.ActionLink("MDT", "GetTime", new { zone = "mdt" }, new AjaxOptions { UpdateTargetId = "myResults" }) 
    <br /> 
</p> 
<div id="myResults" style="border: 2px dotted red; padding: .5em;"> 
    Results will appear here 
</div> 
<p> 
    This page was generated at @DateTime.UtcNow.ToString("h:MM:ss tt") (UTC) 
</p> 

がもう一度あなたのレイアウトで2つのスクリプトを忘れないでください。

と最終発言:慣例により、すべてのコントローラのアクションはそう、ActionResultsを返す必要があります:

public string GetTime(string zone) 
{ 
    DateTime time = DateTime.UtcNow.AddHours(offsets[zone]); 
    return Content(string.Format("<div>The time in {0} is {1:h:MM:ss tt}</div>", zone.ToUpper(), time)); 
} 

最後に、あなたのページ内の任意のMicrosoft*.jsスクリプトを使用していないことを確認してください。それらは時代遅れです。

+0

ありがとうございました。ダーリン、このフォーラムはあなたを持って幸運です。もう1つの質問。私はマスターページを持っています...そして私はタイトルを2度定義しました(ビジュアルスタジオは私に言います)。 masterpagesのtitle属性をオーバーライドしたい場合はどうすればいいですか?私は何をするでしょうか? – BlackFire27

+0

@ BlackFire27、あなたのレイアウト: ' @ ViewBag.Title'とあなたのビューでは: '{{ViewBag.Title =" Statistics "; } '。 –

0

これはどのようにリンクのHTMLのような表情をロードしています。

は、あなたのページにこれを追加します。

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script> 
+0

hmm..that didnt help – BlackFire27

+0

このファイルがロードされていることを確認しましたか?あなたの問題は、ajaxイベントハンドラがリンクに接続されていないときのように見えます(これは通常、JSに無効にされている場合、JSを無効にしている場合、フォールバックの動作である-btwです)。 – Marc

+0

no..itが有効になっています.i chromeを使用します。 youtube/google work ...私のコードはすべきです。ファイルがロードされたかどうかを確認するにはどうすればよいですか?アップデートツール – BlackFire27

関連する問題