我已经将应用程序从ASP.NET MVC 3更新为ASP.NET MVC 4。
该应用程序在MVC 3中运行良好。唯一无法在MVC 4中运行的是Ajax.Begin表单:该表单默认为全页请求,而不是异步AJAX请求。
本质上,这是我编写的向导,但这无关紧要。Model.Step.ActionName正确返回一个字符串(请参见下面的代码)。
视图中的代码是:
@{
using (Ajax.BeginForm(Model.Step.ActionName, null, new AjaxOptions { UpdateTargetId = "wizardStep", OnBegin="isValid", LoadingElementId="PleaseWait", OnSuccess="SetFocusOnForm" },
new {@name="wizardForm", @id="wizardForm" } ))
{
//form contents
}
}
我注意到MVC 4中的Ajax.BeginForm使用HTML5。我在下面显示了MVC 3和MVC 4呈现表单之间的区别:
MVC 3:
<form action="/Solicitors/Company/New/YourDetails" id="wizardForm" method="post" name="wizardForm" onclick="Sys.Mvc.AsyncForm.handleClick(this, new Sys.UI.DomEvent(event));" onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, loadingElementId: 'PleaseWait', updateTargetId: 'wizardStep', onBegin: Function.createDelegate(this, isValid), onSuccess: Function.createDelegate(this, SetFocusOnForm) });">
// form contents
</form>
MVC 4:
<form action="/Solicitors/Company/New/LoginDetails" data-ajax="true" data-ajax-begin="isValid" data-ajax-loading="#PleaseWait" data-ajax-mode="replace" data-ajax-success="SetFocusOnForm" data-ajax-update="#wizardStep" id="wizardForm" method="post" name="wizardForm" novalidate="novalidate">
// form contents
</form>
我不知道这是否正确,但假设是正确的。
但是,问题在于没有使用Ajax,只是刷新了整个页面。所以sumat是错的…
问题是:怎么了?
好,我已经解决了。
在MVC 3应用程序中,我在web.config中注释了以下内容:
<appSettings>
<add key="webpages:Version" value="1.0" />
<!--<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />-->
</appSettings>
这解释了为什么asp.net mvc 3无法呈现html 5。
在新的mvc
4应用程序中,默认设置为ClientValidationEnbled=true
和UnobstrusiveJavaScriptEnabled=true
,如下所示:
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
...
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
因此,我的应用程序需要包含以下javascript文件:
<script src="@Url.Content("~/Scripts/jquery-1.7.1.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/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
它需要丢弃microsoft * .js文件,即:
@*<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script>*@
在阅读@Darin Dimitrov对以下问题的答复后,我想出了这一点:
从ASP.NET MVC
3开始,MicrosoftAjax.js,MicrosoftMvcAjax.js和MicrosoftMvcValidation.js是否已过时?
非常感谢达林。答案值得一读,以启发我自己禁用的两个appSettings的含义。
问题内容: 我用这个Ajax.BeginForm 我需要在控制器中写些什么才能捕获此OnSucces和OnFailure。 因为OnSuccess我需要显示成功消息 OnFailure我需要显示其他消息。 在我的控制器中 可以给anydboy帮帮我吗。 谢谢 问题答案: OnSuccess和OnFailure看起来像他们期望的javascript回调函数。 Pro ASP.NET Framewor
问题内容: 我有一个使用HttpPostedFileBase的默认活页夹绑定模型和文件上传的表单。 使用Html.BeginForm()时,此方法工作正常。但是,我想使用AJAX执行相同的操作,因此我将其替换为Ajax.BeginForm()并相应地更改了参数。 该模型仍然可以正确绑定,但是我无法将文件上传绑定到HttpPostedFileBase。 这将绑定模型和文件上传: 这仅绑定模型: 控制
问题内容: 关于SO与Ajax.BeginForm的问题有很多关于SO的问题,这些主题没有正确地使用返回的局部视图更新目标元素: mvc4 ajax更新同一页 ASP.NET MVC 4-Ajax.BeginForm和html5 MVC4(剃刀)-控制器是返回partialview但整个页面正在更新MVC4Ajax不会更新页面内的PartialView 但是,所有这些都可以通过手动写出jQuery
问题内容: 我有一个似乎无法满足的简单要求:我有一个产品页面。产品具有供应商,供应商输入是带有自动完成功能的文本字段。如果用户输入数据库中不存在的供应商,则需要添加它。要添加它,我在.load()页面上有一个DIV并调用了我的/ Vendor / Create控制器方法。该方法的视图使用: 这应该通过ajax发布我的表单,完成后调用Javascript。我遇到的问题是,提交后,我的整个页面都会刷新
问题内容: 但我不断收到“失败”错误消息框 Index.cshtml 控制者 Files.cshtml Global.asax 问题答案: 更好的方法是使用jquery表单插件。 这是示例: Html.BeginForm 行动方法 进度条 jQuery和表单脚本 更新中… 两次遇到调用操作方法问题的人都归功于Ajax.BeginForm,只需将其转换为Html.BeginForm()。
问题内容: 我想在我的OnSuccess回调中添加更多参数( 但保留ajax上下文变量 )。 我所做的是: JS函数: 但为空。 我怎么做? 问题答案: 由于正在使用,我猜测您没有使用不引人注意的javascript东西(在MVC3中,您已设置),而是在引用MicrosoftAjax,js和MicrosoftMvcAjax.js文件。如果是这种情况,您只需删除关键字。 如果您通过jquery.un