当前位置: 首页 > 面试题库 >

Ajax.BeginForm不触发AJAX脚本,回退回退

东方弘壮
2023-03-14
问题内容

我将使用解决方案来更新此问题,我想包括我的问题和解决方案,因为我无法在Stackoverflow上找到它。如果您想加入解决方案,请放心。

我有一个使用Visual Studio 2013创建的新创建的“空”
MVC5项目。如果可能,我需要from并想要AJAX行为。在MVC3中使用Ajax.BeginForm总是很简单,所以我认为在MVC5中也是如此。

但是,当我单击“提交”按钮时,在AjaxOptions中的OnBegin,OnFailure或OnSuccess中指定的所有javascript函数都不会被调用。取而代之的是,将无Ajaxless的帖子发送到服务器,这通过检查Request.IsAjaxRequest返回false来证明是正确的。

我得出的结论是,由于某种原因,根本没有使用ajax。我检查了很多东西,例如web.config,布局脚本等。

我的布局包括以下脚本:

<script src="~/Scripts/jquery-1.5.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

我的web.config包括:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
</configuration>

我的看法:

@model ContactEnquiryViewModel

@{
AjaxOptions ContactOptions = new AjaxOptions()
{
    OnBegin = "OnConactFormBegin()",    
    OnSuccess = "OnContactFormSuccess()",
    OnFailure = "OnContactFormFailure()"
    };
}

<div id="EnquiryFormContainer">

@using (Ajax.BeginForm("Contact", "Home", new { formName = "EnquiryForm" }, ContactOptions))
    {
    @Html.HiddenFor(m => m.Subject)

    <div class="field">
        @Html.LabelFor(m => m.FirstName)
        @Html.TextBoxFor(m => m.FirstName)
        <div class="validation">
            @Html.ValidationMessageFor(m => m.FirstName)
        </div>
    </div>

    <div class="field">
        @Html.LabelFor(m => m.LastName)
        @Html.TextBoxFor(m => m.LastName)
        <div class="validation">
            @Html.ValidationMessageFor(m => m.LastName)
        </div>
    </div>

    <div class="field">
        @Html.LabelFor(m => m.Email)
        @Html.TextBoxFor(m => m.Email)
        <div class="validation">
            @Html.ValidationMessageFor(m => m.Email)
        </div>
    </div>

    <div class="field">
        @Html.LabelFor(m => m.PhoneNumber)
        @Html.TextBoxFor(m => m.PhoneNumber)
        <div class="validation">
            @Html.ValidationMessageFor(m => m.PhoneNumber)
        </div>
    </div>

    <div class="field">
        @Html.LabelFor(m => m.Comments)
        @Html.TextAreaFor(m => m.Comments)
        <div class="validation">
            @Html.ValidationMessageFor(m => m.Comments)
        </div>
    </div>

    <div id="submitButtonContainer">
        <input type="submit" value="Submit" name="submit" />
    </div>
    }
</div>

我的控制器动作(未完成):

[HttpPost]
public ActionResult Contact(ContactViewModel viewModel, String formName = "")
    {
    if (Request.IsAjaxRequest())
        {
        return new EmptyResult();               
        }

    return new EmptyResult();
    }

我检查了有关此问题的其他一些帖子,但找不到解决方案。尽管有人暗示可能的解决方案,但我对Microsoft
CDN(http://www.asp.net/ajaxlibrary/cdn.ashx)感到困惑。

在Microsoft CDN上,它们具有以下部分:

以下CD.NET MVC JavaScript文件托管在此CDN上:

ASP.NET MVC 5.0

http://ajax.aspnetcdn.com/ajax/mvc/5.0/jquery.validate.unobtrusive.js
http://ajax.aspnetcdn.com/ajax/mvc/5.0/jquery.validate.unobtrusive.min.js

ASP.NET MVC 4.0

http://ajax.aspnetcdn.com/ajax/mvc/4.0/jquery.validate.unobtrusive.js
http://ajax.aspnetcdn.com/ajax/mvc/4.0/jquery.validate.unobtrusive.min.js

ASP.NET MVC 3.0

http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.unobtrusive-ajax.js
http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.unobtrusive-ajax.min.js
http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.js
http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.min.js
http://ajax.aspnetcdn.com/ajax/mvc/3.0/MicrosoftMvcAjax.js
http://ajax.aspnetcdn.com/ajax/mvc/3.0/MicrosoftMvcAjax.debug.js

ASP.NET MVC 2.0

http://ajax.aspnetcdn.com/ajax/mvc/2.0/MicrosoftMvcAjax.js
http://ajax.aspnetcdn.com/ajax/mvc/2.0/MicrosoftMvcAjax.debug.js

ASP.NET MVC 1.0

http://ajax.aspnetcdn.com/ajax/mvc/1.0/MicrosoftMvcAjax.js
http://ajax.aspnetcdn.com/ajax/mvc/1.0/MicrosoftMvcAjax.debug.js

他们似乎建议您为MVC5所需的唯一脚本是jquery.validate.unobtrusive。


问题答案:

自从我在布局中包含以下脚本以来,一切都开始起作用:

<script src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.unobtrusive-ajax.min.js"></script>

在Microsoft CDN上,此脚本看起来像是MVC3特定的。

如果可能,请随意提供更好的方法,或者回答以下问题:“为什么此脚本未包含在MVC项目模板(VS2013)中?”



 类似资料:
  • 问题内容: 我正在处理用户脚本,但我发现当主页发出AJAX请求时,该脚本未运行。 有什么方法可以在主页加载和AJAX请求上触发用户脚本? 问题答案: 在AJAX请求上重新运行脚本代码的明智方法是,专注于页面的关键部分并检查更改。 例如,假设页面包含如下所示的HTML: 并且您希望脚本对每个注释进行处理。 现在,您 可以 拦截所有AJAX调用, 或者侦听 (不建议使用)或使用s,但是这些方法可能会变

  • 我有这个脚本: HTML中的用法: 由于某些原因,它的工作,如果页面重新加载一半,但不,它没有开火,在它工作之前,所以我不知道发生了什么。我在wordpress网站上使用这个。

  • Git版本回退的意思就是将本地代码回退到某一个指定的版本,此版本之前的所有内容都会被重置. 操作方法: VCS —> Git —> Reset HEAD—> 弹出Reset Head对话框. Reset HEAD: Reset Type: 回退类型 Mixed:回退到某个版本,本地源码不会回退, 会回退commit和index信息. Soft:回退到某个版本, 本地源码和index信息不会回退,

  • 我们使用进行了测试,我们可以很好地操作哨兵进行故障转移,但是脚本不会触发。 相关信息: 我们使用的是3.2中的配置文件(我们不得不使用,因为我们自己的配置文件已经被更新程序替换了)。 在中,两个脚本的路径是正确的: 我们甚至将这些文件的权限更改为,但仍然什么也没有。 我们已经关闭了redis和Sentinel的保护模式。 被注释掉,因为我们需要绑定到所有适配器,但是我们也尝试了 其他一切似乎都有效

  • 问题内容: 我正在显示项目ID和标题。还有一个链接“显示此成员的项目”。单击它会显示该用户的项目。为此,我使用ajax。有一个脚本可以检测单击复选框。此选项对于第一个列出的项目正常工作,但对ajax返回的项目无效 脚本代码和ajax是 getdetails.php代码是 问题答案: 使用此脚本

  • 问题内容: 我正在链接到CDN上的jQuery Mobile样式表,如果CDN失败,我想回退到样式表的本地版本。对于脚本,解决方案是众所周知的: 我想为样式表做类似的事情: 我不确定是否可以实现类似的方法,因为我不确定浏览器在链接脚本时是否以与加载脚本时相同的方式进行阻止(也许可以在script标签中加载样式表,然后将其注入页面)? 所以我的问题是:如果CDN失败,如何确保样式表已本地加载? 问题