【问题标题】:MVC 3 Ajax.ActionLink not workingMVC 3 Ajax.ActionLink 不工作
【发布时间】:2011-08-29 11:12:24
【问题描述】:

我正在玩一些基于 MvcMusicStore 示例的商店,并且在使用 MVC3 Ajax.ActionLink / Ajax.RouteLink 帮助程序时遇到了一些问题。问题在于它根本不会生成 Ajax 请求(Request.IsAjaxRequest() == false)。我使用 Ajax.BeginForm / Ajax.BeginRouteForm 生成的表单运行良好。

配置:

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

脚本:

    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

链接:

@Ajax.ActionLink("show cart", "Show", "Cart", new AjaxOptions() { OnSuccess = "handleSuccess", HttpMethod = "Get", OnFailure = "handleFailure" })

生成 HTML:

<a data-ajax="true" data-ajax-failure="handleFailure" data-ajax-method="Get" data-ajax-success="handleSuccess" href="/Cart/Show">show cart</a>

如前所述,这很好用:

@using (Ajax.BeginForm(
        "Show",
        new { controller = "Cart" },
        new AjaxOptions
        {
            OnSuccess = "handleSuccess",
            OnFailure = "handleFailure"
        }))
    {
        <input type="submit" class="button" />
    }

动作如下所示:

[Authorize]     
public ActionResult Show()
{
    if (Request.IsAjaxRequest())
    {
        ViewBag.CartItems = ShoppingCart.GetCart(this)
            .Items;

        return Json(new AjaxResultViewModel()
        {
            Content = RenderPartialViewToString(),
            UpdateTargetSelector = "#dialog",
            InsertionMode = InsertionMode.InsertBefore
        }, JsonRequestBehavior.AllowGet);
    }

    ViewBag.Exception = new NotSupportedException();
    return View("Error");
}

我已经搜索了一段时间,找不到这种行为的原因,也许有人可以帮助我?

最好的问候!

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-ajax unobtrusive-javascript actionlink


    【解决方案1】:

    在靠近底部的_layout.cshtml 上的新MVC4 模板中,有一个@Scripts.Render("~/bundles/jquery")

    我必须包括 @Scripts.Render("~/bundles/jqueryval") 是 Ajax 库

    这解决了我在使用索引页面进行完整回发时遇到的问题。我的动作链接代码:

    <div id="timeDisplay">
    @Ajax.ActionLink("Click to display server time", "Time", new AjaxOptions { HttpMethod="GET",UpdateTargetId="timeDisplay"});
    </div>
    

    【讨论】:

    • 我将此标记为答案,因为它似乎可以解决问题,尽管它已经有一段时间(和以前的版本)并且我无法再测试它了。
    • +1:干得好。这启动了我的 Ajax.ActionLink(没有其他原因没有触发)
    【解决方案2】:

    我通过按确切顺序声明以下脚本使其工作:

    @section script
    {
      <script src="@Url.Content("~/Scripts/MicrosoftAjax.debug.js")" type="text/javascript"></script>
      <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.debug.js")" type="text/javascript"></script>
      <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript">   </script>
    }
    

    为了完整起见,在我的 *_Layout.cshtml* 文件中,我声明了以下内容:

    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    
    @RenderSection("script", required:false)
    
    <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
    

    【讨论】:

    • Microsoft JS 文件已经失效了一段时间,并且自 MVC3 以来已经过时(它们在 MVC4 中消失了)。预装的 jQuery 是官方替代品。
    【解决方案3】:

    也许[this post]有答案。

    简而言之:js函数“handleSuccess”和“handleFailure是否可以通过表单访问

    Lg 瓦拉帕

    【讨论】:

    • 嘿 Warappa,是的,这些功能是可以访问的。而且由于我可以从请求标头中看出它甚至没有创建正确的 AJAX 请求。我想我会坚持使用 BeginForm 帮助器,因为它有效。只是不是最漂亮的解决方案;)
    • 另外:我已经很难了解您帖子中描述的行为。但我很确定,因为 2 个测试链接是在 html 中的同一点生成的。第一行失败,第二行成功。奇怪 ;) 显示购物车
      显示购物车
    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2014-11-25
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多