2010-08-07 9 views
5

Soy nuevo en MVC y estoy implementando la aplicación de muestra Nerd Dinner MVC en MS MVC2. Estoy en el paso 10, "Ajax permite RSVPs acepta". He añadido el nuevo controlador de RSVP y añadí el método de acción Registro de este modo:Error de cena de nerd en la llamada de Ajax al método de acción de registro

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

añadí las referencias a ambas bibliotecas de scripts Ajax y añadido el código de abajo para ver los detalles tal como se describe en el artículo:

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

Cuando pulso en el "confirmación de asistencia a este evento" enlace me sale un EROR 404 diciendo que el recurso no se puede encontrar:

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 

Cuando entro en el código que está encontrando la Regi método de acción del ester correcto. Después de jugar con él, eliminé el "AcceptVerbs (HttpVerbs.Post)" de la restricción en el método Register, y luego funcionó. Sin embargo, no volvió a cargar la página, solo mostró el mensaje "Gracias, te vemos allí" en una nueva página en blanco. Al mirar el html en la página de detalles, no hay envío de formularios, así que me pregunto si el código Ajax necesita algo más para que la llamada se publique. ¿Hay algún problema conocido con esta parte de la aplicación Nerd Dinner? Creo que la aplicación fue escrita en MVC1 y estoy usando MVC2. ¿Esto marca una diferencia?

TIA,

Ciaran

Respuesta

1

Esta porción de su acción explica por qué que acaba de obtener el mensaje "nos vemos allí":

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

Eso es todo lo que está siendo devuelto.

La razón por la que estaba recibiendo un 404 para empezar, es el uso de un ActionLink:

Ajax.ActionLink(... 

que va a crear un enlace URL, un no recibe un POST y el AcceptVerbs(HttpVerbs.Post) habría obligado a ningún partido. Debe presentar un formulario para hacer un post:

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

Hola Tahbaza, se supone que el texto devuelto actualiza un div dentro de la página de detalles - UpdateTargetId = "rsvpmsg". De acuerdo con el código y las capturas de pantalla en el tutorial de Scott Gu a continuación, se hace clic en el enlace "Registrarse" y el div se actualiza con el texto devuelto. No estoy seguro de cómo funciona su muestra cuando no está haciendo una publicación:

0

Para hacer un HTTP POST con Ajax.ActionLink, que tendría que hacer, por ejemplo, new AjaxOptions { UpdateTargetId="rsvpmsg",HttpMethod="POST"}

+0

Hola, lo intenté pero aún tengo el mismo error 404. Cuando agregué el HttpMethod = "POST" produjo el html a continuación:

1

En caso de que ayude a otra persona, tuve el problema al utilizar MVC 3 y fue porque tenía un enlace a las bibliotecas MS AJAX y MVC 3 usa jQuery por defecto, así que solo necesito descomentar los enlaces en mi página maestra y estuvo bien.

0

si se incluyen los dos en su site.master, que debería estar bien

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

Como comentario adicional a la depuración de problemas con este problema, al ser un/desarrollador JSF Java, me encontré con una dura lección que

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

y

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

se procesan de manera diferente. El primero no funciona y el segundo funciona correctamente.

1

Estos son los detalles.cshtml usado en MVC3. El problema con la redirección usando GET, y no POST es similar.

<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, por lo que he mencionado anteriormente que he tenido el mismo problema, y ​​viene del hecho de que MVC 3 utiliza JavaScript discreta.

Para que esto funcione, usted tiene 2 soluciones, se trata de desactivar discreto Javascript en su archivo webconfig:

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

acaba de establecer en false, y durante la ficha Generar, JavaScript generado por el enlace de acción se ser javascript en línea normal, que funciona bien, y resulta con algo como esto en 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> 

segunda solución es más de mi gusto y es igual de simple. Sólo tienes que incluir el archivo fuente de JavaScript adicional en su cabecera:

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

El javascript resultante generado es discreto, y los resultados con este en HTML:

confirmación de asistencia a este evento

En ambos casos, el la funcionalidad resultante es la misma, y ​​la segunda solución es "más en espíritu" de MVC 3.

2

El tutorial PDF (frente a la versión HTML en línea) tiene caracteres tipográficos ANSI (0x94) en lugar de ASCII (0x22) el bloque HTML de elementos de script. El bloque correcto se muestra a continuación con todos los caracteres de comillas reemplazados.

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

Visual Studio marcará los archivos de código fuente de JavaScript con la advertencia de garabatos verdes ("Archivo no encontrado") pero no el tipo de atributos por lo que puede notar y corregir el problema sólo para los archivos de origen. Sin embargo, los atributos type seguirán mal formados y esto hará que los scripts no se carguen correctamente en el navegador.

Usando las herramientas de desarrollador de Chrome, noté que las secuencias de comandos no figuraban como Recursos para la página HTML de Detalles. Corregir los caracteres de comillas para los atributos type permitió que la acción Registrar funcionara como se documenta en el tutorial sin cambios.

0

Estaba tratando de convertir a MVC3/Razor mientras trabajaba en este ejemplo. He estado atrapado en este mismo problema por al menos 24 horas ... exactamente los mismos síntomas. Intenté todo en esta página que pude entender o pensé que era relevante.

No tenía la mención de javascript discreta en mi web.config y estaba considerando agregarlo con el valor "falso" pensando que "verdadero" podría ser el predeterminado. Sin embargo, estaba pensando que podría estropear algo más (entre quién sabe qué más).

He encontrado el siguiente tid-bit en el foro de wrox. Si añado la siguiente línea de código a la segunda línea de mi RSVPStatus.cshtml vista parcial:

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

Todo funciona según lo previsto. Sé que Zak mencionó esa línea de código anterior (y un montón de otras cosas que me llevan en la dirección correcta), pero estaba usando la vista parcial y no he visto una etiqueta desde que comencé a jugar con MVC.Sé que es probable que esté en algún lado, pero todo el humo y los espejos de lo que es la programación de MS ahora, hace que sea más difícil de diseccionar y probablemente hubiera seguido el camino de Zak en algún momento. Entonces, +1 para él.

De todos modos, espero que esto ayude a alguien a ahorrar un día.

Cuestiones relacionadas