2010-08-07 13 views
5

我是MVC的新手,我在MS MVC2中實現了Nerd Dinner MVC示例應用程序。我在第10步,「Ajax使RSVPs接受」。我已經添加了新的RSVP控制器與增加了註冊操作方法如下所示:Ajax調用註冊表操作方法的書呆子晚餐錯誤

public class RSVPController : Controller 
{ 
    DinnerRepository dinnerRepository = new DinnerRepository(); 

    // 
    // AJAX: /Dinners/RSVPForEvent/1 

    [Authorize, AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Register(int id) { 

     Dinner dinner = dinnerRepository.GetDinner(id); 

     if (!dinner.IsUserRegistered(User.Identity.Name)) { 

      RSVP rsvp = new RSVP(); 
      rsvp.AttendeeName = User.Identity.Name; 

      dinner.RSVPs.Add(rsvp); 
      dinnerRepository.Save(); 
     } 

     return Content("Thanks - we'll see you there!"); 
    } 
} 

我添加到兩個阿賈克斯腳本庫的引用,並添加下面的詳細信息查看在文章中描述的代碼:

<div id="rsvpmsg"> 

<% if(Request.IsAuthenticated) { %> 

    <% if(Model.IsUserRegistered(Context.User.Identity.Name)) { %>  

     <p>You are registred for this event!</p> 

    <% } else { %> 

     <%= Ajax.ActionLink("RSVP for this event", 
          "Register", "RSVP", 
          new { id=Model.DinnerID }, 
          new AjaxOptions { UpdateTargetId="rsvpmsg"}) %>   
    <% } %> 

<% } else { %> 

    <a href="/Account/Logon">Logon</a> to RSVP for this event. 

<% } %> 

</div> 

當我點擊「RSVP此事件」鏈接,我收到了404 eror稱資源無法找到:

The resource cannot be found. 
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /NerdDinner/RSVP/Register/24 

Version Information: Microsoft .NET Framework Version:2.0.50727.4200; ASP.NET Version:2.0.50727.4205 

當我踏進去的是找到註冊查詢代碼ster action方法正確。在玩弄它之後,我從Register方法的約束中移除了「AcceptVerbs(HttpVerbs.Post)」,然後它就起作用了。然而,它沒有重新加載它剛剛顯示的頁面「謝謝 - 我們將在那裏看到你」的消息在一個新的空白頁面上。查看詳細信息頁面中的html沒有表單提交發生,所以我想知道Ajax代碼是否需要更多的東西來使該調用成爲Post?這部分的書呆子晚餐應用有沒有已知的問題?我認爲應用程序是用MVC1編寫的,而我正在使用MVC2 - 這是否有所不同?

TIA,

夏蘭

回答

1

你的行動的這部分解釋了爲什麼你只得到了「看你有」消息:

return Content("Thanks - we'll see you there!"); 

這是所有這一切被返回。

你得到一個404開頭的原因是使用的ActionLink的:

Ajax.ActionLink(... 

這將創建一個URL鏈接,一個GET而不是POST,和AcceptVerbs(HttpVerbs.Post)將迫使不匹配。你應該提交一個表單做一個帖子:

using (Ajax.BeginForm("Controller", "Action", new AjaxOptions { UpdateTargetId = "f1" })) { %> 
<div id="f1"> 
<!-- form fields here --> 
<input type="submit" /> 
</div> 
<% } %> 
+0

嗨Tahbaza,返回的文本應該更新詳細信息頁面內的div - UpdateTargetId =「rsvpmsg」。根據Scott Gu教程下面的代碼和屏幕截圖,單擊「註冊」鏈接,並使用返回的文本更新div。不知道他的樣本如何工作,當他沒有做一個職位: 2010-08-07 14:01:26

0

爲了使一個HTTP POST與Ajax.ActionLink,你必須做的例如new AjaxOptions { UpdateTargetId="rsvpmsg",HttpMethod="POST"}

+0

嗨,沒錯,我試過,但仍然得到相同的404錯誤。當我添加HttpMethod =「POST」時,它生成了下面的html:

2010-08-07 14:19:26

1

以防萬一它幫助別人,我有問題使用MVC 3,這是因爲我已經鏈接到MS AJAX庫和MVC 3實際上默認使用jQuery,所以我只需要取消註釋我的鏈接母版頁,它很好。

0

如果包含這兩個在site.master,應該沒事

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

作爲一個額外的評論把這個問題調試的問題,是一個Java/JSF開發者,我遇到了一個沉痛的教訓是

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

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

以不同方式處理。第一個根本不工作,第二個工作正常。

1

這是詳細信息。在MVC3中使用cshtml。重定向使用GET,而不是POST類似的問題。

<div id="rsvpmsg"> 
    @if (Request.IsAuthenticated) 
    { 
     if (Model.IsUserRegistered(Context.User.Identity.Name)) 
     { 
     <p> 
      You are registered for this event</p> 
     } 
     else 
     { 
     @Ajax.ActionLink("RSVP for this event", 
     "Register", 
     "RSVP", 
     new { id = Model.DinnerID }, 
     new AjaxOptions { UpdateTargetId = "rsvpmsg", HttpMethod = "Post" }) 
     } 
    } 
    else 
    { 
     <p> 
      <a href="/Account/Logon">Logon</a> to RSVP for this event.</p> 
    } 
</div> 
@section JavaScript 
{ 
    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>; 
    <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>; 
} 

好吧,以前我已經提到我有同樣的問題,它來自於事實,即MVC 3使用不顯眼的JavaScript。

爲了使這項工作,你有2個解決方案,一個是在你的webconfig文件來禁用非侵入式JavaScript:

<appSettings> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    </appSettings> 

只要將它設置爲false,和頁面生成過程中,對於動作鏈接生成的JavaScript會是正常的內聯JavaScript,工作正常,並在HTML像這樣的結果:

<a onclick="Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), 
{ insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'Post', updateTargetId: 'rsvpmsg' });" href="/RSVP/Register/13">RSVP for this event</a> 

第二種解決方案是更合我胃口,這是很簡單。你只需要在您的頭額外的JavaScript源文件:

<head> 
    <title>@ViewBag.Title</title> 
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 
    <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> 
    @RenderSection("JavaScript",required:false) 
</head> 

生成的最終JavaScript是不顯眼,而在HTML這個結果:

RSVP此事件

在這兩種情況下,結果功能是相同的,第二種解決方案是「更精神」的新MVC 3。

2

PDF教程(與在線HTML版本)的印刷版ANSI引用字符(0x94)而不是ASCII(0x22)腳本元素的HTML塊。下面顯示了正確的塊,並替換了所有的引用字符。

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

Visual Studio將JavaScript源文件標記與警告綠色波浪線(「找不到文件」),但不是那種屬性所以你可能會注意到,只有對源文件糾正問題。但是,type屬性的格式不正確,這會導致腳本無法在瀏覽器中正確加載。

使用Chrome開發人員工具,我注意到腳本沒有列爲詳細信息HTML頁面的資源。修正type屬性的引用字符可以使註冊操作按照本教程中記錄的那樣工作,不做任何更改。

0

我試圖通過這個例子來轉換爲MVC3/Razor。至少在24小時內,我一直陷在這個完全相同的問題中......完全相同的症狀。我在本頁面上嘗試了所有我能理解或認爲相關的內容。

我沒有在我的web.config中不顯眼的javascript提及,並且正在考慮將其添加爲「false」值,認爲「true」可能是默認值。然而,我認爲這可能會使其他東西出現問題(誰知道還有什麼)。

我在wrox論壇上發現了以下tid-bit。如果我下面的代碼行添加到我的RSVPStatus.cshtml局部視圖的第二行:如預期

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

一切正常。我知道Zak提到了上面的那一行代碼(以及其他一些讓我朝着正確方向的東西),但是我使用了部分視圖,並且從開始搞亂MVC開始就沒有看到過頭標籤。我知道它可能在某個地方,但現在所有的MS編程的煙霧和鏡像,使得解剖更加困難,並且我可能會在某個時刻走到Zak的路上。所以,爲他+1。

無論如何,希望這可以幫助別人節省一天的時間。