Ajax调用Register操作方法的书呆子晚餐错误

Cia*_*uen 5 asp.net-mvc asp.net-ajax

我是MVC的新手,我正在MS MVC2中实现Nerd Dinner MVC示例应用程序.我在第10步,"Ajax启用RSVP接受".我添加了新的RSVP控制器并添加了Register操作方法,如下所示:

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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我添加了对两个Ajax脚本库的引用,并将下面的代码添加到Details视图中,如文章中所述:

<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>
Run Code Online (Sandbox Code Playgroud)

当我点击"RSVP for this event"链接时,我得到404错误,说无法找到资源:

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
Run Code Online (Sandbox Code Playgroud)

当我进入代码时,它正确地找到了Register动作方法.在玩了之后,我从Register方法的约束中删除了"AcceptVerbs(HttpVerbs.Post)",然后它就可以工作了.但是它没有重新加载页面,只是在新的空白页面上显示"谢谢 - 我们会在那里看到你"的消息.查看详细信息页面中的html没有表单提交,所以我想知道Ajax代码是否需要更多的内容才能使调用成为Post?这部分书呆子晚餐应用程序是否存在已知问题?我认为该应用程序是用MVC1编写的,我使用的是MVC2 - 这是否会产生差异?

TIA,

夏兰

Tah*_*aza 1

这部分操作解释了为什么您只收到“再见”消息:

 return Content("Thanks - we'll see you there!");
Run Code Online (Sandbox Code Playgroud)

这就是所有被返回的内容。

您一开始收到 404 的原因是使用了操作链接:

 Ajax.ActionLink(...
Run Code Online (Sandbox Code Playgroud)

这将创建一个 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>
<% } %>
Run Code Online (Sandbox Code Playgroud)