不显眼的Ajax表单用于部分视图

9

我有困难使用不显眼的ajax从联系我们表单中发布数据。

我的局部视图如下:

@model site.ViewModel.Home.ContactUsViewModel 

@using (Ajax.BeginForm("_ContactUsPartial", "Home", 
                       new AjaxOptions { UpdateTargetId = "result" }))
        {
            <fieldset>
                <legend>Contact Us</legend>
                @Html.ValidationSummary(true)
                <div id="result"></div>
                <div class="editor-label">
                 @Html.LabelFor(m => m.FullName)
                 @Html.ValidationMessageFor(m => m.FullName)</div>
                <div class="editor-field">@Html.TextBoxFor(m => m.FullName)</div>
                <!-- other fields from model -->
                <input type="submit" value="Submit"/>
            </fieldset>
        }

我的局部视图像这样放置在另一个页面上:

@Html.Partial("_ContactUsPartial", new ContactUsViewModel());

我的家庭控制器如下:

[HttpPost]
public ActionResult _ContactUsPartial(ContactUsViewModel viewModel)
{
    if (ModelState.IsValid)
    {
       try
       {
           //send email
           return Content("Thanks for your message!");
       }
       catch (Exception ex)
       {
          return Content("Problem sending the email.");
       }
    }

            return Content("oops. invalid model");
}

当我点击提交按钮时,我希望控制器返回一些文本内容,并将其放置在id为“result”的div中。
实际上发生的是,当我点击提交按钮时,我被重定向到/Home/_ContactUsPartial,并且只显示文本内容。
我不明白这里发生了什么......我已经尝试在网上查找示例,结果让自己越陷越深。
我在Web.config中启用了非侵入式javascript,也引用了jquery.unobtrusive-ajax.min.js。
在我的脚本文件夹中,我有以下相关文件:
- jquery.unobtrusive-ajax.min.js - jquery.validate.unobtrusive.min.js - MicrosoftMvcAjax.js
在我的_Layout.cshtml标签中,我声明了以下内容:
<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>
<script src="@Url.Content("~/Scripts/bootstrap.min.js")" type="text/javascript"></script>

在我的Global.asax.cs文件的Application_Start方法中,我有这样一行代码:
BundleConfig.RegisterBundles(BundleTable.Bundles);

RegisterBundles的代码如下:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));

bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
                        "~/Scripts/jquery-ui-{version}.js"));

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                        "~/Scripts/jquery.unobtrusive*",
                        "~/Scripts/jquery.validate*"));

我不确定bundle是什么以及它们如何工作,因为我好像已经通过这个ScriptBundle配置将它们引入...但是我还手动在_Layout.cshtml的头部进行了配置...

你有什么想法吗?我真的很希望能得到一些帮助!


好的,这似乎是没有正确设置不显眼的问题。您是否确保已从项目中删除了“Microsoft.Unobtrusive”库?我遇到过几次这个问题,最终都是由于库和依赖关系问题引起的。 - Nomad101
@Nomad101 不,我还没有做过那个...不过也不是100%确定该怎么做... - mezoid
你是在使用Visual Studio的Nuget吗?还是其他什么工具?另外,你是否正在实现项目的捆绑? - Nomad101
@Nomad101 我正在使用Nuget...但在我开始工作之前,我的当前项目中已经添加了一些非Nuget的内容。 - mezoid
如果您正在使用bundles,为什么还要使用<script>标签?在您的布局页面中使用@Script.Render(“/bundles/jquery”)@Script.render(“/bundles/jqueryui”)@Script.Render(“~/bundles/jqueryval”)。 - HaBo
显示剩余8条评论
1个回答

15

我终于弄明白了!!!浪费了几个小时的时间!!!

原来是一个配置问题...但不完全如我所预期。

我正在使用jQuery 1.9.1和我认为最新版本的Microsoft.jQuery.Unobtrusive.Ajax版本2.0.30116.0。然而,出现了一个问题... 我仍然使用的jquery unobtrusive ajax js文件使用了已过时的live方法而不是on方法... 即使更新软件包也没有正确地更新文件。

直到我看到了这篇帖子 ASP.NET MVC 4:无法修改jQuery Unobtrusive Ajax ,我检查了我的文件并发现它是旧版本。

起初我使用了jQuery.Migrate nuget软件包来重新启用live方法... 但我发现更好的解决方案是卸载或删除现有文件,并使用nuget重新安装Microsoft.jQuery.Unobtrusive.Ajax软件包。

这解决了问题,现在它正如预期的那样工作!


1
正是我所需要的。在包管理器控制台中运行Install-Package Microsoft.jQuery.Unobtrusive.Ajax,将JS文件添加到我的脚本捆绑包中,我又可以继续工作了。 - Rick james

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接