2010-08-07 8 views
5

Jestem nowy w MVC i wdrażam przykładową aplikację MVC Nerd Dinner w MS MVC2. Jestem na etapie 10, "Ajax umożliwia akceptację RSVP". Dodałem nowy kontroler RSVP i dodaje metodę działania Register tak:Błąd obiadowy Nerd na wezwanie Ajax do rejestracji metody działania

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!"); 
    } 
} 

I dodaje odniesienia do obu bibliotek skryptów Ajax i dodaniu kodu poniżej, aby zobaczyć szczegóły, jak to opisano w artykule:

<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> 

Kiedy klikam „RSVP do tego wydarzenia” link dostaję 404 eror mówiąc zasób nie można znaleźć:

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 

Kiedy krok do kodu to jest znalezienie Regi sterować metodą poprawnie. Po zabawie z nim usunąłem "AcceptVerbs (HttpVerbs.Post)" z ograniczenia w metodzie Register, a następnie zadziałało. Nie odświeżyło jednak strony, na której właśnie wyświetlono komunikat "Dzięki - do zobaczenia" na nowej pustej stronie. Patrząc na html na stronie ze szczegółami, nie ma formularza wysyłania, więc zastanawiam się, czy kod Ajax potrzebuje czegoś więcej, aby zadzwonić do Posta? Czy jest jakiś znany problem z tą częścią aplikacji Nerd Dinner? Myślę, że aplikacja została napisana w MVC1 i używam MVC2 - czy to powoduje różnicę?

TIA,

Ciaran

Odpowiedz

1

Ta część swojego działania tłumaczy, dlaczego po prostu pojawia się komunikat "see you there":

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

to wszystko, co jest zwracana.

Powodem było uzyskanie 404 na początku jest użycie actionlink:

Ajax.ActionLink(... 

To stworzy link URL, GET nie POST, a AcceptVerbs(HttpVerbs.Post) byłby zmuszony żadnego meczu. należy złożyć formularz, aby zrobić wpis:

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

Cześć Tahbaza, zwracany tekst powinien zaktualizować element div na stronie szczegółów - UpdateTargetId = "rsvpmsg". Zgodnie z kodem i zrzutami ekranu na tutorialu Scotta Gu poniżej kliknięto link "Rejestruj", a element div został zaktualizowany za pomocą zwróconego tekstu. Nie wiesz, jak działa jego próbka, gdy nie robi posta:

0

złożyć HTTP POST z Ajax.ActionLink, trzeba by zrobić na przykład new AjaxOptions { UpdateTargetId="rsvpmsg",HttpMethod="POST"}

+0

Cześć, próbowałem tego, ale wciąż mam ten sam błąd 404. Kiedy dodałem HttpMethod = "POST", wygenerowałem HTML poniżej:

1

Na wypadek, gdyby pomogło komuś innemu, miałem problem z używaniem MVC 3 i to dlatego, że miałem połączenie z bibliotekami MS AJAX, a MVC 3 faktycznie używa jQuery domyślnie, więc musiałem odkomentować linki w moim strona wzorcowa i było w porządku.

0

jeśli obejmują te dwa w swojej site.master, powinno być dobrze

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

Jako dodatkowy komentarz do debugowania problemów z tym problemem, będąc/JSF programista Java, wpadłem na twardą lekcję tego

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

i

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

przetwarzane są w różny sposób. Pierwszy nie działa, a drugi działa poprawnie.

1

To są szczegóły.cshtml używany w MVC3. Problem z przekierowaniem za pomocą GET, a nie POST jest podobny.

<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>; 
} 

Ok, więc wcześniej wspomniałem, że miałem ten sam problem, i to wynika z faktu, że MVC 3 wykorzystuje dyskretną JavaScript.

Aby dokonać tej pracy, masz 2 rozwiązania, jedno jest wyłączenie dyskretny JavaScript w pliku webconfig:

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

Wystarczy ustawić go na wartość false, a podczas widoku kompilacji, JavaScript wygenerowany link działanie będzie być normalne inline JavaScript, który działa dobrze, a wyniki z czymś takim w 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> 

drugie rozwiązanie jest bardziej do gustu i to jest właśnie tak proste. Po prostu trzeba to dodatkowy plik źródłowy JavaScript w nagłówku:

<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> 

Powstały javascript generowane jest dyskretny, a wyniki z tego w HTML:

RSVP do tego wydarzenia

w obu przypadkach wynikowa funkcjonalność jest taka sama, a drugie rozwiązanie to "bardziej w duchu" nowego MVC 3.

2

Samouczek PDF (w porównaniu z wersją HTML online) ma typograficzne znaki ANSI (0x94) zamiast ASCII (0x22) w blok HTML elementów skryptu. Prawidłowy blok jest pokazany poniżej ze wszystkimi zastąpionymi cudzysłowami.

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

Visual Studio oznaczy pliki źródłowe JavaScript z ostrzeżeniem zielonych zawijasów („File not found”) ale nie typ atrybutów więc można zauważyć i naprawić problem jedynie dla plików źródłowych. Jednak atrybuty type nadal będą zniekształcone, co spowoduje, że skrypty nie będą poprawnie ładowane w przeglądarce.

Za pomocą narzędzi programistycznych Chrome zauważyłem, że skrypty nie zostały wymienione na stronie Zasoby dotyczące szczegółów HTML. Poprawienie znaków cudzysłowu dla atrybutów type umożliwiło działanie rejestru, co zostało udokumentowane w samouczku bez żadnych zmian.

0

Próbowałem przekonwertować na MVC3/Razor, jak pracowałem przez ten przykład. Utknąłem na tym samym problemie przez co najmniej 24 godziny ... dokładnie te same objawy. Próbowałem wszystkiego na tej stronie, co mogłem zrozumieć lub uważać za istotne.

Nie miałem dyskretnego komentarza javascript w moim web.config i rozważałem dodanie go z "fałszywą" wartością "domyślnie" może być "prawda". Jednak myślałem, że może to coś zepsuć (pośród, kto wie, co jeszcze).

Znalazłem następujące tid-bit na forum wrox. Jeśli dodać następujący wiersz kodu do drugiej linii mojego RSVPStatus.cshtml częściowym widokiem:

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

Wszystko działa zgodnie z przeznaczeniem. Wiem, że Zak wspomniał powyższą linię kodu (i kilka innych rzeczy, które poprowadziły mnie we właściwym kierunku), ale korzystałem z częściowego widoku i nie widziałem nagłówka, odkąd zacząłem bawić się z MVC.Wiem, że prawdopodobnie gdzieś tam jest, ale wszystkie dymy i zwierciadła tego, co teraz programuje MS, sprawia, że ​​trudniej jest je rozdzielić i pewnie w pewnym momencie poszłabym na ścieżkę Zaka. Tak więc +1 dla niego.

W każdym razie, miej nadzieję, że pomaga to komuś zaoszczędzić dzień.

Powiązane problemy