使用javascript / jquery提交Ajax.BeginForm表单仍然返回部分视图作为MVC3的整页

时间:2012-01-05 10:58:21

标签: asp.net-mvc-3 jquery partial-views telerik-mvc

注意:在原始帖子后更新 - 在底部解决方案)

问题:

我正在使用MVC3并使用Ajax.BeginForm创建了Telerik ComboBox的局部视图,然后我尝试使用附加到ComboBox的javascript处理程序作为客户端事件来提交它。

但是,无论何时提交并获取Controller,Request.IsAjaxRequest()都返回false,因此不会将其视为ajax请求。如果我添加一个单独的提交按钮并使用它提交表单然后在Controller中,Request.IsAjaxRequest()返回true。

目前的结果是我的PartialView作为整页返回,而不是替换必要的div。参考下面的源代码,它是从Controller返回的BUserControl,但是作为整页。

我也尝试使用非Telerik DropDownList并获得相同的结果。

如果有人能够确定可能出现的问题,我将非常感激。

这是包含部分视图的Razor页面:

@inherits ABC.DEF.Site.ViewClasses.ViewModelView<ABC.DEF.Site.Models.ViewModel>           
@{
   ViewBag.Title = "DEF - View Creation";        
}

<div class="editor-label">
   @Html.Label("System", "System")
</div>

<div class="editor-field">
   @Html.Partial("AUserControl", Model)       
</div>

<div class="editor-label">
   @Html.Label("Type", "Type")
</div>

<div class="editor-field" id="B">
   @Html.Partial("BUserControl", Model)                           
</div>

这是AUserControl的部分视图

@inherits ABC.DEF.Site.ViewClasses.ViewModelView<ABC.DEF.Site.Models.ViewModel>           
@using (Ajax.BeginForm("LoadB", "View", new AjaxOptions { UpdateTargetId = "B" }))
{ 
@(Html.Telerik().ComboBoxFor(m => m.SelectedA)
    .BindTo(new SelectList(GetExistingViewData.As, "Id", "DisplayName"))
    .HtmlAttributes(new { style = string.Format("width:{0}px", 500) })                    
    .ClientEvents(events => events.OnChange("onSelectedAChange"))
)          
}

<script type="text/javascript">

function onSelectedAChange() 
{
    $(this).parents('form').submit();
}
</script> 

这是BUserControl的局部视图(请注意,它引用了一个“C”div,我在这篇文章中为了简洁而故意忘记了Razor页面):

@inherits ABC.DEF.Site.ViewClasses.ViewModelView<ABC.DEF.Site.Models.ViewModel>
@using (Ajax.BeginForm("LoadC", "View", new AjaxOptions { UpdateTargetId = "C" }))
{
@(Html.Telerik().ComboBoxFor(m => m.SelectedB)
    .BindTo(new SelectList(GetExistingViewData.GetBs(Model.SelectedA), "Id", "DisplayName" ))
    .HtmlAttributes(new { style = string.Format("width:{0}px", 500) })
    .ClientEvents(events => events.OnChange("onSelectedBChange"))        
)     
}
<script type="text/javascript">
    function onSelectedBChange() {
        $(this).parents('form').submit();
}            
</script>

最后,这是在AUserControl中的Combo发生变化时调用的Controller函数:

    [HttpPost]
    public ActionResult LoadBs(ViewModel model)
    {
        PartialViewResult res = PartialView("BUserControl", model);
        return res;
    }

在这个Controller函数中,如果我在立即窗口中键入Request.IsAjaxRequest(),则返回false。

我检查过的事情(正如其他地方多次提到的那样):

  • 我在_Layout.cshtml中包含了jquery.unobtrusive-ajax.min.js文件
  • 我在网站的web.config中包含了key =“UnobtrusiveJavaScriptEnabled”value =“true”条目
  • 我不包括较旧的MVCAjax js文件
  • 更改页面和部分视图,使@model标记位于顶部,而不是@inherits - 没有任何影响

这些建议就像在similar question

中一样

其他细节:

  • 它在IIS 7,Windows 7上运行,浏览器是IE8
  • 我有一个非常相似的单独示例项目,工作正常,我看不出两者之间有任何重大差异。

--------现在根据以下解决方案解决了这个问题--------

最后在两天后解决了这个问题 - 回复以便如果其他人遇到同样的问题,那将有助于他们!

在我们的_Layout.cshtml页面中,我们在head部分包含以下行以包含jQuery库:

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

但是,因为我们正在使用Telerik MVC控件,所以我们在_Layout.cshtml页面中也有以下行:

@Html.Telerik().ScriptRegistrar();

这会注册Telerik控件的正确javascript包含。

默认情况下,会在页面末尾添加以下内容:

<script src="@Url.Content("~/Scripts/2011.3.1115/jquery-1.6.4.min.js")" type="text/javascript">

这个更新版本的jquery(或两者都包括在内)显然会导致ajax表单提交出现问题,因为我在我的另一个示例项目(完全正常工作)中包含了这一行,然后它就崩溃了。

所以,回到主项目 - 略微改变Telerik脚本注册行将删除默认的jQuery包含,然后一切正常。

@Html.Telerik().ScriptRegistrar().jQuery(false);

Controller现在将提交识别为正确的Ajax回发,部分视图正确返回。

0 个答案:

没有答案