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

时间:2010-08-07 12:36:16

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

我添加了对两个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>

当我点击“此活动的RSVP”链接时,我收到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

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

TIA,

夏兰

8 个答案:

答案 0 :(得分:2)

PDF教程(与在线HTML版本相比)在脚本元素的HTML块中具有印刷ANSI引号字符(0x94)而不是ASCII(0x22)。下面显示了正确的块,并替换了所有引号字符。

<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属性的引号字符允许Register操作按照教程中的说明进行操作,不做任何更改。

答案 1 :(得分: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>
<% } %>

答案 2 :(得分:1)

以防它帮助其他人,我遇到了使用MVC 3的问题,因为我已经链接到MS AJAX库,而MVC 3默认使用jQuery,所以我只需要取消注释我母版页中的链接这很好。

答案 3 :(得分:1)

作为调试此问题的另一个注释,作为一名Java / JSF开发人员,我遇到了一个艰难的教训

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

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

的处理方式不同。第一个完全没有工作,第二个工作正常。

答案 4 :(得分:1)

这是MVC3中使用的Details.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文件中禁用Unobtrusive Javascript:

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

只需将其设置为false,在页面构建期间,为Action链接生成的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.

答案 5 :(得分:0)

要制作包含Ajax.ActionLink的http帖子,您必须执行以下操作: new AjaxOptions { UpdateTargetId="rsvpmsg",HttpMethod="POST"}

答案 6 :(得分:0)

如果你在site.master中包含这两个,那就应该没问题

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

答案 7 :(得分:0)

当我通过这个例子时,我试图转换为MVC3 / Razor。我现在至少24小时都坚持这个完全相同的问题......完全相同的症状。我尝试了本页面上我能理解或认为相关的所有内容。

我没有在我的web.config中提及不引人注目的javascript,并且考虑将其添加到&#34; false&#34;价值思考&#34;真实&#34;可能是默认值。但是,我认为它可能会搞砸其他东西(谁知道还有什么)。

我在wrox论坛上发现了以下几点。如果我将以下代码行添加到我的RSVPStatus.cshtml局部视图的第二行:

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

一切都按预期运作。我知道Zak提到了上面的代码行(以及其他一些引导我朝着正确方向发展的东西),但是我使用了局部视图并且因为我开始搞乱MVC而没有看到头标记。我知道它可能存在于某个地方,但现在MS编程的所有烟雾和镜子都使得解剖变得更加困难,而且我可能会在某些时候沿着Zak的路走下去。所以,给他+1。

无论如何,希望这可以帮助别人节省一天。